• 剑指offer 面试题0:高质的代码:即考虑边界条件、特殊输入和错误处理


    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;
    }
  • 相关阅读:
    WSGI原理
    主从数据库
    mysql高级
    记录
    获取当前时间
    sql注入和防sql注入
    python操作MySQL
    修改Windows10 命令终端cmd的编码为UTF-8
    MySQL查询
    MySQL数据库操作
  • 原文地址:https://www.cnblogs.com/parzulpan/p/11247502.html
Copyright © 2020-2023  润新知