程序员面试题目总结--数组(一)【递归求数组所有元素和、用一个for循环打印出一个二维数组、用递归判断数组是否是递增、有序数组中删除重复元素】
2014-07-29 10:16
916 查看
1、给定一个含有n个元素的整型数组a,求a中所有元素的和(递归实现)
题目:给定一个含有n个元素的整型数组a,求a中所有元素的和(递归实现)
分析:如果元素个数为0,则和为0;如果数组元素个数为n,那么先求出前n-1个元素之和,再加上a[n-1]即可
2、用一个for循环打印出一个二维数组
题目:用一个for循环打印出一个二维数组
分析:只使用一次for循环,这就需要知道二维数组在内存中是按照行存储方式存储的,所以可以将二维数组看成一个一维数组
3、用递归算法判断一个数组是否是递增
题目:判断一个数组是否是递增(递归)
分析:
(1)如果数组长度为1,则该数组递增,返回true
(2)如果数组长度为n(n>=2),则先比较最后两个元素是否递增,如果最后两个元素递增,则再递归比较除去最后一个元素的前n-1个元素是否递增
4、有序数组中删除重复元素(每个元素只能出现一次)
题目:给定一个排序过的数组,要求in
place的移除重复元素,返回处理后的数组长度
例:1 1 1 1 2 2 2 3 =====> 1 2 3
方法1:
5、有序数组中删除重复元素(上题的变型,这里元素至多可以重复两次)
题目:给定一个排序过的数组,要求in
place的移除重复元素,返回处理后的数组长度(元素至多可以重复两次)
例:1 1 1 1 2 2 2 3 =====> 1 1 2 2 3
方法1:
分析:维护一个counter,当counter是2时,就直接跳过即可,否则说明元素出现次数没有超,继续放入结果数组,若遇到新元素则重置counter。
当counter为3时,这样元素至多可以重复3次
下面是一个简洁版本,上面的方法容易扩展,只需将counter改为3时,这样元素至多可以重复3次。
题目:给定一个含有n个元素的整型数组a,求a中所有元素的和(递归实现)
分析:如果元素个数为0,则和为0;如果数组元素个数为n,那么先求出前n-1个元素之和,再加上a[n-1]即可
int GetSum(int a[], int n) { return n==0 ? 0 : GetSum(a,n-1)+a[n-1]; }
2、用一个for循环打印出一个二维数组
题目:用一个for循环打印出一个二维数组
分析:只使用一次for循环,这就需要知道二维数组在内存中是按照行存储方式存储的,所以可以将二维数组看成一个一维数组
//用一个for循环打印出一个二维数组 #include<iostream> #include<vector> #include<iomanip> using namespace std; int main() { int m,n; cout << "请输入行和列:" << endl; cin >> m >> n; vector<vector<int> > vec(m,vector<int>(n)); for(int i=0; i<m ;i++) for(int j=0;j< n;j++) vec[i][j]=i*j; cout << "两次for循环:" << endl; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) cout<<setw(5)<<vec[i][j]; cout<<endl; } cout << "一次for循环:" << endl; for(int i=0;i<m*n;i++) { cout << setw(5) << vec[i/n][i%n]; if((i+1)%n == 0) cout << endl; } /************************************************************************/ /* 三维数组时: 如 int a[2][2][3]={{{1,6,3},{5,4,15}},{{3,5,33},{23,12,7}}}; for(int i=0;i<12;i++) cout << a[i/6][(i/3)%2][i%3] << endl; /************************************************************************/ }
3、用递归算法判断一个数组是否是递增
题目:判断一个数组是否是递增(递归)
分析:
(1)如果数组长度为1,则该数组递增,返回true
(2)如果数组长度为n(n>=2),则先比较最后两个元素是否递增,如果最后两个元素递增,则再递归比较除去最后一个元素的前n-1个元素是否递增
bool isIncrease(int a[], int n) { if(n<=1) return true; return (a[n-1] >= a[n-2]) && isIncrease(a,n-1); }
4、有序数组中删除重复元素(每个元素只能出现一次)
题目:给定一个排序过的数组,要求in
place的移除重复元素,返回处理后的数组长度
例:1 1 1 1 2 2 2 3 =====> 1 2 3
方法1:
int RemoveDuplicate(int a[], int n) { if (n == 0) return 0; int index = 0; for (int i = 1; i < n; i++) { if (a[index] != a[i]) a[++index] = a[i]; } return index + 1; }方法2:使用STL
int RemoveDuplicate(int a[], int n) { return distance(a, unique(a, a + n)); }
5、有序数组中删除重复元素(上题的变型,这里元素至多可以重复两次)
题目:给定一个排序过的数组,要求in
place的移除重复元素,返回处理后的数组长度(元素至多可以重复两次)
例:1 1 1 1 2 2 2 3 =====> 1 1 2 2 3
方法1:
分析:维护一个counter,当counter是2时,就直接跳过即可,否则说明元素出现次数没有超,继续放入结果数组,若遇到新元素则重置counter。
当counter为3时,这样元素至多可以重复3次
int RemoveDuplicate(int a[], int n) { if(a==NULL || n==0) return 0; int idx = 0; int count = 0; for(int i=0;i<n;i++) { if(i>0 && a[i]==a[i-1]) { count++; if(count>=3) continue; } else { count = 1; } a[idx++]=a[i]; } return idx; }方法2:
下面是一个简洁版本,上面的方法容易扩展,只需将counter改为3时,这样元素至多可以重复3次。
int RemoveDuplicate1(int a[], int n) { if(a==NULL || n==0) return 0; if(n<=2) return n; int count=2; int index=count; for(int i=count;i<n;i++) { if(a[i]!=a[index-count]) a[index++]=a[i]; } return index; }
相关文章推荐
- 程序员面试题目总结--数组(二)【二分查找、找出给定数字出现次数、两个有序整型数组交集、找出数组中唯一的重复元素、判断数组中的数值是否连续相邻】
- 程序员面试题目总结--数组(五)【数组的后面m个数移动为前面m个数、列的前n项数据、判断整数x是否可以表示成n个连续正整数的和、数组中出现奇数次的元素、二维数组中的查找】
- 程序员面试题目总结--数组(三)【旋转数组的最小数字、旋转数组中查找指定数、两个排序数组所有元素中间值、数组中重复次数最多的数、数组中出现次数超过一半的数】
- 程序员面试题目总结--数组(四)【数列中符合条件数对的个数、数组是否存在重复元素、重新排列数组使数组左边为奇数,右边为偶数、数组中的第二大数、数组中的最小值和最大值】
- 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。(Python实现)
- 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 题目:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- Python实遍历二维数组题目一:在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 剑指offer——题目描述 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数。
- 如何判断一个整数数组中是否有重复元素?要求时间复杂度O(n),空间复杂度O(1)
- 有序整型数组A,大小为n,请给出一个O(n)的算法,删除重复元素,O(1)空间
- 用于判断数组是否完全包含另外的一个数组的所有元素
- 判断一个数组中是否有重复的元素
- 在一个二维数组中,每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序。 请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整数
- 时间复杂度为O(n)来判断数组a[N](1 <= a[i] <= N)中是否有重复元素 (某公司校园招聘笔试题目)
- 递归思维判断数组a[N]是否为一个递增数组
- 一个长度为N的整形数组,数组中每个元素的取值范围是[0,N-1],写一个算法判断数组中是否存在重复的数字
- 删除有序数组中重复元素的一个非常简洁的算法