您的位置:首页 > 职场人生

数组类常见面试大题

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的讲解

#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讲解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: