Q:把一个字符串转换为整数。
A1:一个普通但漏洞百出的解法。
int StrToInt(char* str) { int number = 0; while (*str != 0) { number = number * 10 + *str - '0'; ++str; } return number; }
漏洞:没有考虑输入的字符串中是否有非数字字符或正负号或空格,并不能转换成整数时该如何错误处理;没有考虑溢出;如果传入是空指针,程序将崩溃,代码不够鲁棒。
A2:初级程序员的解法。
#include <iostream> using namespace std; int StrToInt(const char* str) { int symbol = 1; int number = 0; //空指针 if (str == nullptr) { return 0; } //正负号 if (*str == '-') { symbol = -1; ++str; } while (*str != 0) { if (*str <= '9' && *str >= '0') { int temp = number * 10 + *str - '0'; if ((temp - (*str - '0')) / 10 != number) { //产生溢出 return 0; } number = number * 10 + *str - '0'; //利用位运算效率能高点 number = (number << 1) + (number << 3) + *str & 0xf; ++str; //举个例子, 3 * 10 + 5 = 35, 如果(35 - 5) / 10不等于3,那么就产生了溢出 } else { //存在异常字符 return 0; } } return number*symbol; } int main() { const char* str = "-10001252554354534"; cout << StrToInt(str) << endl; return 0; }
Q:求链表中的倒数第k个节点。
A:注意要考虑空指针,节点个数小于k,k=0等情况
struct ListNode { int val; ListNode* next; ListNode(int x) :val(x), next(nullptr) {} }; ListNode* FindKthToTail(ListNode* head, unsigned int k) { //节点为空,或者k为0 if (head == nullptr || 0 == k) { return nullptr; } ListNode* pA = head; ListNode* pB = head; int nodeCnt = 0; while (pA->next != nullptr) { ++nodeCnt; pA = pA->next; } //k大于节点数量 if (k > nodeCnt) { return nullptr; } pA = head; for (unsigned int i = 0; i < k - 1; ++i) { pA = pA->next; } while (pA->next != nullptr) { pA = pA->next; pB = pB->next; } return pB; }