题目:剑指offer 67题

需要考虑的情况:空指针、nullptr、空字符串""、正负号、数值溢出。在写代码的时候对这些特殊的输入都定义好合理的输出。
可以定义一个全局布尔型变量g_nStatus来判断是否是错误输入;可以定义一个minus布尔型变量来存储正负号的结果。

enum Status { kValid = , kInvalid };  // enum特性,默认kInvalid = 1
int g_nStatus = kValid; long long StrToIntCore(const char* digit, bool minus) {
long long num = ; // 64位整型
while (*digit != '\0') {
if (*digit >= '' && *digit <= '') {
int flag = minus ? - : ;
num = num * + flag * (*digit - ''); // 32位整数是否溢出,0x7FFFFFFF和0x80000000分别代表32位的最大正整数和最小负整数
if ((!minus && num > 0x7FFFFFFF) || (minus && num < (signed int)0x80000000)) {
num = ;
break;
}
digit++;
}
else {
num = ;
break;
}
}
if (*digit == '\0') {
g_nStatus = kValid;
}
return num;
} int StrToInt(const char* str) {
g_nStatus = kInvalid;
long long num = ;
if (str != nullptr && *str != '\0') {
bool minus = false;
if (*str == '+')
str++;
else if (*str == '-') {
str++;
minus = true;
} if (*str != '\0') {
num = StrToIntCore(str, minus);
}
}
}

总结:

在剑指offer中,明确提出,在写代码前考虑所有可能的测试用例,是非常好的一个编程习惯。在思考问题的过程中,把问题考虑得尽可能周到,代码尽量完整。如果让面试官指出你代码中存在的问题,此时印象分已经大打折扣,即使你反应再快,在他们眼里bug也是出现了。

05-11 13:21