两道面试算法题

最近面试 两道算法题 说难不难 要写全对也不容易 很惭愧 我没有一次写对

第一道:无序int数组 找到中位数

void swap(int &a,int &b){
    int temp = a ;
    a = b;
    b = temp;
}

int get_kth_number(vector<int> &num,int k,int start,int end){
    //类似于快排的一次划分 
    int pivot = num[start];
    int i = start+1;
    int j = end;

    while(i<j){
        int index = start;
        while(num[i]>pivot&&i<j){
            i++;
        }//找到比i小的数 或者i>=j说明找不到了
        while(num[j]<pivot&&i<j){
            j--;
        }
        //如果i==j了 说明之前的循环找不到比pivot小的数 或者当前循环找不到比pivot大的数
        //或者找到了比pivot大的数
        if(i==j) break;
        else swap(nums[i],nums[j]);
    }
    //一次划分结束
    index = i;
    if(index==k-1) return num[index];
    else if(index>k-1){
        return get_kth_number(num,start+k,start,index-1);
    }
    else{
        return get_kth_number(num,end-k,index+1,end);
    }



int get_middle(vector<int> &num){

    int middle = num.size()>>1;
    return get_kth_number(num,middle,0,size-1);
}

第二道:自己实现atoi(char *p,int err)

#define NULLPTR -1
#define OVERFLOW -2

int atoi(char *s, int& err) {
    bool positive = true;
    int res = 0;
    if(s==NULL){
        err = NULLPTR;
        return -1;
    }
    char* pos = s;
    while(*pos==' '){
        pos++;
    }
    if(*pos=='+'){
        positive = true;
        pos++;
    }
    else if(*pos=='-'){
        positive = false;
        pos++;
    }

    while(*pos=='0'){
        pos++;
    }
    if(strlen(pos)>=11) {
        err= OVERFLOW;
        return -1;
    }
    if(strlen(pos)==10){
        if((positive&&strcmp(pos,"2147483647")>0)||(!positive&&strcmp(pos,"2147483648")>0){   
            err= OVERFLOW;
            return -1;
        }
    }
    while(pos<='9'&&pos>='0'){
        //count++;
        res=res*10+*pos-'0';
        pos++;
    }
    retrun positive?res:-1*res;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值