昨天刚来到学校,昨天过的还不错,早上很早起床,锻炼吃饭,昨天刷了一天算法,晚上跑步打篮球,这样的节奏很好不错,继续坚持。今天早上亦是如此。第一个开实验室门,开窗,烧水。还是总结一下昨天干嘛了0x80000000就是0啊,用这个还是很高端,一定要记住这个数字2147483647。昨天看的主要是关于数组的,那就开始第一个吧,

一  重排问题
      给定含有n个元素的整型数组a,其中包括0元素和非0元素,对数组进行排序,要求:
          1、排序后所有0元素在前,所有非零元素在后,且非零元素排序前后相对位置不变
          2、不能使用额外存储空间
              例子如下
              输入 0、3、0、2、1、0、0
              输出 0、0、0、0、3、2、1


#include<stdio.h>


int main(){
int a[7]={0,3,0,2,1,0,0};
int i,t,k=6;
for(i=6;i>=0;i--)
if(a[i]!=0)
{
t=a[k];
a[k]=a[i];
a[i]=t;
k--;
}
for(i=0;i<7;i++)
printf("%d ",a[i]);
printf("\n");


return 0;
}

来自博主​​http://blog.chinaunix.net/uid-26548237-id-3753737.html​

二  找出绝对值最小的元素
       给定一个有序整数序列(非递减序),可能包含负数,找出其中绝对值最小的元素,比如给定序列 -5、-3、-1、2、8 则返回1。
      分析:由于给定序列是有序的,而这又是搜索问题,所以首先想到二分搜索法,只不过这个二分法比普通的二分法稍微麻烦点,可以分为下面几种情况
      如果给定的序列中所有的数都是正数,那么数组的第一个元素即是结果。
      如果给定的序列中所有的数都是负数,那么数组的最后一个元素即是结果。
       如果给定的序列中既有正数又有负数,那么绝对值的最小值一定出现在正数和负数的分界处。

 

#include<stdio.h>
#include<math.h>

int main(){
int a[5]={-5,-3,-1,2,8};
int i,k,min;
int n=5;
int flag1=0,flag2=0;
for(i=0;i<n;i++){
if(a[i]>0)
flag1=1;
if(a[i]<0)
flag2=1;
}
printf("\n\n%d%d\n\n",flag1,flag2);
if(flag1==0&&flag2==0)
printf("该数组全为0\n");
if(flag1==0&&flag2==1) //全为<0
printf("最小绝对值为%d\n",abs(a[n-1]));
if(flag1==1&&flag2==0) //全为>0
printf("最小绝对值为%d\n",a[0]);
if(flag1==1&&flag2==1) //有正有负
{
for(i=0;i<n;i++)
if(a[i]<0)
{
min=a[i];
k=i;
}
if(abs(a[i])>a[k+1])
printf("最小绝对值为%d\n",a[k+1]);
else
printf("最小绝对值为%d\n",abs(min));

}
return 0;
}

三 函数 int func(int i ,int N);
其中i <= N,功能输出i递增到N再递减到i的整数,每行输出一个数。比如func(1,5)就是
1
 2
 3
 4
 5
 4
 3
 2
 1
要求:
1、只能有1个语句,即一个分号
2、不能使用do while until goto for if关键字,不能使用?:和逗号运算符
3、唯一能使用的库函数为printf

我感觉这个太屌了   能看懂递归就很不错了

#include<stdio.h>

int func(int i,int n){

return (i==n&&printf("%d\n",i))||(printf("%d\n",i)&&func(i+1,n)&&printf("%d\n",i));
}

int main(){

func(0,5);
return 0;
}

 

 

四  整数组合

     这个真的看了好长好长时间,感觉结果自己吧程序跑了一遍,只知道怎么回事,还是有点不太懂,不太懂的慢慢懂吧

有一个元素各不相同的整数数组,输入元素的所有组合,长度由大到小。例如:[1, 2, 3, 4],依次输出1234,123,134,234,12,13,14,23,24,1,2,3,4

 

思路:

1、设输出的组合的长度为m(m<=n)

2、把数组分为两个部分:第一个数和后面的m-1个数

3、如果组合里包含第一个数,则下一步在剩余的n-1个数里选取m-1个字符;如果不包含第一个数,则下一步在剩余的m-1个数里面选取m个数

把n个数中求长度为m的组合分解成:求n-1个数里面长度为m-1个数的组合,以及从n-1个数里面求长度为m的组合的两个子问题,用递归解决。另外,可以使用vector或者statck数据结构存储当前的结果,本文采用的是vector。

#include<iostream>
#include<vector>

using namespace std;


// totalLen:数组长度,curIndex:递归过程中的“第一个”元素在数组中的位置,
// lengthLeft:组合中需要添加的元素个数,res:存放当前组合的元素
void combine(int *a,int totalLen,int curIndex,int lengthLeft,vector<int>&res){
if(lengthLeft==0){
vector<int>::const_iterator iter=res.begin();
for(;iter != res.end();++iter)
cout<<*iter;
cout<<endl;
return ;
}
if(curIndex==totalLen)
return;

res.push_back(a[curIndex]);
combine(a,totalLen,curIndex+1,lengthLeft-1,res);
res.pop_back();
combine(a,totalLen,curIndex+1,lengthLeft,res);

}

void combinationOfInt(int *a,int len){
int i=4;
if(!a)
return ;
vector<int> res;
//for(int i=len;i>=1;--i)
combine(a,len,0,i,res);
}

int main(){
int a[]={1,2,3,4,5};
combinationOfInt(a,5);

return 0;
}