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_MAX和INT_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 三者转换
朱颜辞镜花辞树,敏捷开发靠得住!