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;
}