0909滴滴面试小结

近期的第一场面试,一言以蔽之:“准备的都没问,问的刚好💔”,不是太难,还是复习的不全面,打击才刚刚开始,越挫越奋,加油!

1.自我介绍,聊了一会项目

 

2.拷贝构造函数(浅拷贝和深拷贝)

这个问题,C++拷贝构造函数详解一文讲得比较清楚了,基本上和c++ primer plus中相关部分差不多,值得一瞧!

又顺带问了下c++里的动态内存分配,这也是个经典的老问题了。

 

4.atoi(即 alphanumeric to integer)函数的实现

再常见不过的题,很久之前在leetcode上刷过此题(参见:),不过全程使用string。很久没做,今天要求使用原型的形式:int atoi(const char *nptr),还有点想不起来,做的不太好,考虑不全(💔)!!

注意的点:

1.字符串所表示数字的正负号

2.结束条件:遇到非数字或者结束符‘\0’

3.考虑字符串前的空白,直到遇到数字或正负号才开始转换

4.判断是否溢出:分别与int表示的最大值和最小值比较,根据正负返回INT_MAXINT_MIN

5.如果字符串不含有效参数,如:全是空格或字母等,返回0

#include<iostream>

int atoi(const char *str) {
    if(str == NULL || strlen(str) <=0)
        return 0;
    bool negative = false;
    while(*str == ' ') ++str;
    if(*str == '-'){
        negative = true;
        ++str;
    }
    if(*str == '+') ++str;
    
    long long res = 0;
    while(*str!='\0'){
        if( *str>='0' && *str<='9') {
            res = res*10 + *str - '0';
        } else {
            break;
        }
        ++str;
    }
    res = negative ? -res : res;
    
    if(res>INT_MAX) return INT_MAX;
    else if(res<INT_MIN) return INT_MIN;
    else return res;
}

int main(){
    //注意输入,char *str里str只是一个字符串指针,只是存储一个字符串指针变量,要想用cin输入字符串,必须声明字符数组。
    char* str;
    char a[20];
    str=a;
    
    /*循环输入
    while(std::cin>>str){
        int res=atoi(str);
        std::cout<<res<<std::endl;
    }
     */
    std::cin>>str;
    int res=atoi(str);
    std::cout<<res<<std::endl;
    
    return 0;
}

还可参考下:http://blog.csdn.net/feliciafay/article/details/17111231

判断溢出时如果先不加符号,可以这么写(当然还是上面的简洁):

if(negative && res > INT_MAX+1LL){
    return INT_MIN;
}
else if(!negative && res > INT_MAX){
    return INT_MAX;
}

顺便谈下Sizeof与Strlen的区别吧:

 

各种输入的形式:

C++ 输入函数getline(cin,str) 与cin.getline(str,int)区别

 

拓展: char*,const char*和string 三者转换

 

posted @ 2016-09-09 16:47  小金乌会发光-Z&M  阅读(775)  评论(0编辑  收藏  举报