程序员面试题目总结--数组(五)【数组的后面m个数移动为前面m个数、列的前n项数据、判断整数x是否可以表示成n个连续正整数的和、数组中出现奇数次的元素、二维数组中的查找】
2014-08-01 14:41
1101 查看
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个元素的顺序全部颠倒
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]) 并将较小值的指针前移,然后继续比较。
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)是否是偶数
24、找出数组中出现奇数次的元素
题目:给定一个含有n个元素的整型数组array,其中只有一个元素出现奇数次,找出这个元素
分析: 因为对于任意一个数k;有k^k=0,k^0=k,所以将数组中所有元素进行异或,那么个数为偶数的元素异或后都变成了0,只留下了个数为奇数的那个元素
25、二维数组中的查找
题目:在一个二维数组matrix中,每一行都从左到右递增排序,每一列都从上到下递增排序,在这个二维数组中判断指定的数是否存在
分析:首先选取数组中右上角的数字,如果该数字等于要查找的数字,查找过程结束;如果该数字大于要查找的数字,剔除这个数字所在的列;如果该数字小于要查找的数字,剔除这个数字所在的行。也就是说如果要查找的数字不在数组的右上角,则每一次都在数组的查找范围中剔除一行或者一列,这样每一步都可以缩小查找范围,直到要查找的数字,或者查找范围为空。查找步骤图示如下:在下面的二维数组中查找7(参考于<<剑指offer>>)
题目:有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; }
相关文章推荐
- 程序员面试题目总结--数组(二)【二分查找、找出给定数字出现次数、两个有序整型数组交集、找出数组中唯一的重复元素、判断数组中的数值是否连续相邻】
- 程序员面试题目总结--数组(一)【递归求数组所有元素和、用一个for循环打印出一个二维数组、用递归判断数组是否是递增、有序数组中删除重复元素】
- 程序员面试题目总结--数组(三)【旋转数组的最小数字、旋转数组中查找指定数、两个排序数组所有元素中间值、数组中重复次数最多的数、数组中出现次数超过一半的数】
- 程序员面试题目总结--数组(四)【数列中符合条件数对的个数、数组是否存在重复元素、重新排列数组使数组左边为奇数,右边为偶数、数组中的第二大数、数组中的最小值和最大值】
- 判断一个整数x是否可以表示成n(n>=2)个连续正整数的和
- 如何判断一个整数x是否可以表示成n个连续正整数的和
- 12、一个整数数列,元素取值可能是0~65535中的任意一个数,相同数值不会重复出现。0是例外,可以反复出现。 请设计一个算法,当你从该数列中随意选取5个数值,判断这5个数值是否连续相邻。
- 剑指offer——题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 在一个长度为10的整形数组中,已经放置好了任意10个整数。要求用户任意输入 一个整数,判断该数字是否在数组中。如果在,删除数组中该元素,并把后面的 元素往前挪。(让空出的位置在最后)
- Python实遍历二维数组题目一:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 二维数组中的查找-在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 对于任意正整数都可以找出至少一串连续奇数,它们的和等于该整数的立方,验证2-20是否满足。
- 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- indexOf() 如何判断一个元素在指定数组中是否存在? 找出指定元素出现的所有位置? indexOf()方法 是正序查找,lastIndexOf()是倒叙查找
- 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。(Python实现)
- 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- (2)int A[nSize],其中隐藏着若干0,其余非0整数,写一个函数int Func(int* A, int nSize),使A把0移至后面,非0整数移至数组前面并保持有序,返回值为原数据中第一个元素为0的下标。(尽可能不使用辅助空间且考虑效率及异常问题,注释规范且给出设计思路)
- 写一个函数int Func(int* A, int nSize), 使A把0移至后面,非0整数移至数组前面 并保持有序,返回值为原数据中第一个元素为0的下标。