21、将数组的后面m个数移动为前面m个数
题目:有n个整数,使前面各数后移m个位置,最后m个数变成最前面m个数,例如有10个数的数组,为{1,2,3,4,5,6,7,8,9,10},n=10,如果m=5,调整后变为{6,7,8,9,10,1,2,3,4,5}
分析: 可以通过递归的方法实现:
1、将前面n-m个元素的顺序颠倒
2、将后面m个元素的顺序颠倒
3、将n个元素的顺序全部颠倒
void reverse(int* begin, int* end)
{
while(begin < end)
{
int tmp=*begin;
*begin++ = *end;
*end-- = tmp;
}
}
void Move(int a[],int n,int m)
{
reverse(a,a+n-m-1);
reverse(a+n-m,a+n-1);
reverse(a,a+n-1);
}
22、计算出序列的前n项数据
题目:正整数序列Q中的每个元素都至少能被正整数a和b中的一个整除,现给定a和b,如何计算出Q中的前几项?例如:当a=3,b=5,N=6时,序列为3,5,6,9,10,12
分析:可以与归并排序联系起来,给定两个数组A,B,数组A存放:3*1,3*2,3*3,... 数组B存放:5*1,5*2,5*3,...有两个指针i,j,分别指向A,B的第一个元素,取Min(A[i],B[j]) 并将较小值的指针前移,然后继续比较。
void Generate(int arry[],int a, int b, int N)
{
int tmpA,tmpB;
int i=1;
int j=1;
for(int k=0;k<N;k++)
{
tmpA=a*i;
tmpB=b*j;
if(tmpA <= tmpB)
{
arry[k]=tmpA;
i++;
}
else
{
arry[k]=tmpB;
j++;
}
}
}
23、判断一个整数x是否可以表示成n(n>=2)个连续正整数的和
题目:判断一个整数x是否可以表示成n(n>=2)个连续正整数的和
分析: 假设x可以表示成n个连续正整数的和,则数学表达式如下:x=m+(m+1)+(m+2)+...+(m+n-1) --> x=(2m+n-1)*n/2,变换后m=(2*x/n-n+1)/2 m>=1 即判断(2*x/n-n+1)是否是偶数
int main()
{
int m=0,n=0,start=0,end=0,flag=0;
float tmp=0.0;
cout << "请输入被分解的数" << endl;
cin >> m;
cout << "请输入需要被分解的数字的个数" << endl;
cin >> n;
tmp=(float)m/n-(float)(n-1)/2;
if(tmp==(int)tmp)
{
for(flag=1,start=(int)tmp,end=start+n;start<end;start++)
cout << start <<' ';
cout << endl;
}
if(flag==0)
cout << "没有符合条件的数" << endl;
}
24、找出数组中出现奇数次的元素
题目:给定一个含有n个元素的整型数组array,其中只有一个元素出现奇数次,找出这个元素
分析: 因为对于任意一个数k;有k^k=0,k^0=k,所以将数组中所有元素进行异或,那么个数为偶数的元素异或后都变成了0,只留下了个数为奇数的那个元素
int FindElementWithOddCount(int a[], int n)
{
int res=a[0];
for(int i=1;i<n;i++)
{
res ^=a[i];
}
return res;
}
25、二维数组中的查找
题目:在一个二维数组matrix中,每一行都从左到右递增排序,每一列都从上到下递增排序,在这个二维数组中判断指定的数是否存在
分析:首先选取数组中右上角的数字,如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数字,剔除这个数字所在的列;如果该数字小于要查找的数字,剔除这个数字所在的行。也就是说如果要查找的数字不在数组的右上角,则每一次都在数组的查找范围中剔除一行或者一列,这样每一步都可以缩小查找范围,直到要查找的数字,或者查找范围为空。查找步骤图示如下:在下面的二维数组中查找7(参考于<<剑指offer>>)
bool Find(int* matrix, int rows, int columns, int number)
{
bool found = false;
if(matrix != NULL && rows > 0 && columns > 0)
{
int row = 0;
int column = columns - 1;
while(row < rows && column >=0)
{
if(matrix[row * columns + column] == number)
{
found = true;
break;
}
else if(matrix[row * columns + column] > number)
-- column;
else
++ row;
}
}
return found;
}