剑指offer 67. 字符串转换为整数(Leetcode 8. String to Integer (atoi))
题目:剑指offer 67题
需要考虑的情况:空指针、nullptr、空字符串""、正负号、数值溢出。在写代码的时候对这些特殊的输入都定义好合理的输出。
可以定义一个全局布尔型变量g_nStatus来判断是否是错误输入;可以定义一个minus布尔型变量来存储正负号的结果。
enum Status { kValid = 0, kInvalid }; // enum特性,默认kInvalid = 1 int g_nStatus = kValid; long long StrToIntCore(const char* digit, bool minus) { long long num = 0; // 64位整型 while (*digit != '\0') { if (*digit >= '0' && *digit <= '9') { int flag = minus ? -1 : 1; num = num * 10 + flag * (*digit - '0'); // 32位整数是否溢出,0x7FFFFFFF和0x80000000分别代表32位的最大正整数和最小负整数 if ((!minus && num > 0x7FFFFFFF) || (minus && num < (signed int)0x80000000)) { num = 0; break; } digit++; } else { num = 0; break; } } if (*digit == '\0') { g_nStatus = kValid; } return num; } int StrToInt(const char* str) { g_nStatus = kInvalid; long long num = 0; 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也是出现了。