zoukankan      html  css  js  c++  java
  • 剑指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;
    }
  • 相关阅读:
    拉格朗日插值
    [数论] hdu 5974 A Simple Math Problem (数论gcd)
    混合图欧拉回路
    上下界网络流
    HDU 6623 Minimal Power of Prime(数学)
    图的连通度
    最小点权覆盖和最大点权独立集
    最大权闭合子图(最小割,蕴含式最大获利问题)
    CodeForces Goodbye 2017
    网络流建模汇总
  • 原文地址:https://www.cnblogs.com/parzulpan/p/11247502.html
Copyright © 2011-2022 走看看