数组类常见面试大题
2014-06-12 15:04
127 查看
1,数组排序
http://www.cnblogs.com/bobodeboke/p/3416716.html
2,数组查找
http://www.cnblogs.com/bobodeboke/p/3430211.html
3,输入:一个长度为n的整数数组input
输出:一个长度为n的整数数组result,满足result[i]=input数组中除了input[i]之外所有数值的乘机
要求:时间复杂度为O(n)
思路:使用辅助数组,right[]和left[];left[i]记录input[i]之前所有元素的成绩,right[i]记录input[i]之后所有元素的乘积
4,一个数组,里面的数据没有任何限制,要求求出这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它
借助于辅助数组rightMin[i];记录原始数组array[i]右侧(包括它自己)的最小值。
之后开始从头遍历整个数组,如果当前的最大值刚好等于rightMin[i];那么这个最大值一定满足条件
其实,本质的思想很简单,就是左边的最大值和右边的最小值重合了
5,数组中出现次数超过一般的元素
这三个问题的答案,相见代码部分和p22的讲解
3,4,5讲解
http://www.cnblogs.com/bobodeboke/p/3416716.html
2,数组查找
http://www.cnblogs.com/bobodeboke/p/3430211.html
3,输入:一个长度为n的整数数组input
输出:一个长度为n的整数数组result,满足result[i]=input数组中除了input[i]之外所有数值的乘机
要求:时间复杂度为O(n)
思路:使用辅助数组,right[]和left[];left[i]记录input[i]之前所有元素的成绩,right[i]记录input[i]之后所有元素的乘积
4,一个数组,里面的数据没有任何限制,要求求出这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它
借助于辅助数组rightMin[i];记录原始数组array[i]右侧(包括它自己)的最小值。
之后开始从头遍历整个数组,如果当前的最大值刚好等于rightMin[i];那么这个最大值一定满足条件
其实,本质的思想很简单,就是左边的最大值和右边的最小值重合了
5,数组中出现次数超过一般的元素
这三个问题的答案,相见代码部分和p22的讲解
#include<iostream> using namespace std; //数组相关的面试题 //题目一 //输入:一个长度为n的整数数组input //输出:一个长度为n的整数数组result,满足result[i]=input数组中除了input[i]之外所有数值的乘机 //要求:时间复杂度为O(n) //思路:使用辅助数组,right[]和left[];left[i]记录input[i]之前所有元素的成绩,right[i]记录input[i]之后所有元素的乘积 int* cal(int* input,int n){ int* result=new int ; int* left=new int ; int* right=new int ; left[0]=1; right[n-1]=1; int i=0; for(i=1;i<n;i++){ left[i]=left[i-1]*input[i-1]; } for(i=n-2;i>=0;i--){ right[i]=right[i+1]*input[i+1]; } for(i=0;i<n;i++){ result[i]=left[i]*right[i]; } delete[] left; delete[] right; return result; } //题目2:一个数组,里面的数据没有任何限制,要求求出这样的数a[i],其左边的数都小于等于它,右边的数都大于等于它 void smallLarge(int* array, int n){ int* small=new int ; int i; small[n-1]=array[n-1]; for(i=n-2;i>=0;i--){ if(small[i+1]>array[i]){ small[i]=array[i]; }else{ small[i]=small[i+1]; } } for(i=0;i<n;i++){ cout<<small[i]<<" "; } cout<<endl; int max=0; for(i=0;i<=n-1;i++){ if(max<array[i]){ max=array[i]; } if(max==small[i]){ cout<<array[i]<<endl; } } delete[] small; } //题目三 //数组中有一个数字出现的次数超过了数组长度的一半,找出这个数字 int findNumMoreThanHalf(int* array ,int n){ int currentNum=array[0]; int curretnTime=1; for(int i=1;i<n;i++){ if(currentTime==0){ currentNum=array[i]; currentTime=1; } if(array[i]!=currentNum){ currentTime--; }else{ currentTime++; } } return currentNum; } int main(){ int input[]={7,10,2,6,19,22,32}; smallLarge(input,7); return 0; }
3,4,5讲解
相关文章推荐
- 关于面试常见的一个数组中找出出现一次的几个数字的问题
- 也谈前端面试常见问题之『数组乱序』
- 【面试常见题目之动态规划】连续子序列的最大和(子数组的最大和)
- 面试中常见的数组的操作:遍历,最值,反转,冒泡排序,二分查找(附代码)
- 面试常见算法1:有序数组去重
- JavaScript求数组Array的并集(javascript面试常见题目)
- 常见面试算法题:给定数组中寻找加和为特定数的两个数
- 笔试面试中关于数组的常见算法
- 关于数组的js编程题(面试很常见哦)
- 回答六个常见的面试问题
- 常见的软件测试人员面试问题
- C#.Net的常见面试试题(2)
- 常见的abap面试题目,请大家对照学习
- zz 外企招聘:面试官提问常见面试问题
- [转]回答六个常见的面试问题
- 常见的abap面试题目,请大家对照学习
- C#.Net的常见面试试题(3)
- C#.Net的常见面试试题(3)——ASP.NET基本概念
- 常见的abap面试题目,请大家对照学习
- JAVA常见面试问题(收藏)