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;
    }
  • 相关阅读:
    什么是 bean 的自动装配?
    什么是 Spring 的内部 bean?
    什么是 Spring 的 MVC 框架?
    Spring AOP and AspectJ AOP 有什么区别?
    解释 JDBC 抽象和 DAO 模块?
    volatile 类型变量提供什么保证?
    一个 Spring Bean 定义 包含什么?
    什么是 Spring MVC 框架的控制器?
    使用 Spring 访问 Hibernate 的方法有哪些?
    什么是 Callable 和 Future?
  • 原文地址:https://www.cnblogs.com/parzulpan/p/11247502.html
Copyright © 2011-2022 走看看