• 数组类常见面试大题


    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[n];
            int* left=new int[n];
            int* right=new int[n];
            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[n];
            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讲解
  • 相关阅读:
    office2010卸载出现安装程序包的语言不支持
    Red Hat 7.5 Yum Replacement
    0801作业
    0730会员注册
    0730作业2:随机生成6位的字符串验证码,要求包含数字、大小写字母
    0730作业一练习:输出学习阶段目标
    0727作业1 根据学员英文名找到学员对象
    注册
    随机数
    Map
  • 原文地址:https://www.cnblogs.com/bobodeboke/p/3783977.html
Copyright © 2020-2023  润新知