剑指 第3章 高质量的代码(代码的完整性、鲁棒性)

数值的整数次方

题目:给定一个double类型的浮点数base和int类型的整数exponent。求base的exponent次方。

思路:注意分情况:幂次大于0、小于0

class Solution {
public:
    double Power(double base, int exponent) {
        if (exponent == 0) return 1;
        else if(exponent > 0){
            int res = base;
            for (int i = 1; i < exponent; i++)
                res *= base;
            return res;
        }
        else return 1/Power(base, -exponent);
    }
};

调整数组顺序使奇数位于偶数前面

题目:输入一个整数数组,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前半部分,所有的偶数位于数组的后半部分,并保证奇数和奇数,偶数和偶数之间的相对位置不变。
思路:新建一个数组先把原数组中的奇数push进去再把偶数push进去,然后用新数组数据覆盖原数组即可
复杂度O(n)

class Solution {
public:
    void reOrderArray(vector<int> &array) {
        vector<int> res;
        for (int i = 0; i < array.size(); i++)
            if (array[i] % 2 == 1) res.push_back(array[i]);
        for (int i = 0; i < array.size(); i++)
            if (array[i] % 2 == 0) res.push_back(array[i]);
        array = res;
    }
};

链表中倒数第k个节点

题目:输入一个链表,输出该链表中倒数第k个结点。

思路:注意鲁棒性

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* FindKthToTail(ListNode* pListHead, unsigned int k) {
        if (pListHead == nullptr || k == 0) return nullptr;
        ListNode *p1 = pListHead, *p2 = pListHead;
        for (int i = 0; i < k - 1; i++){
            if (p1->next != nullptr) p1 = p1->next;
            else return nullptr;
        }
        while (p1->next != nullptr){
            p1 = p1->next;
            p2 = p2->next;
        }
        return p2;
    }
};

反转链表

题目:输入一个链表,反转链表后,输出新链表的表头。

思路:分析过程,需要定义三个指针,保存当前节点、当前节点的上一节点、当前节点的下一节点

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* ReverseList(ListNode* pHead) {
        ListNode *pReverseHead = nullptr, *pNode = pHead, *pPrev = nullptr;
        while (pNode != nullptr){
            ListNode *pNext = pNode->next;
            if (pNext == nullptr) pReverseHead = pNode;
            pNode->next = pPrev;
            pPrev = pNode;
            pNode = pNext;
        }
        return pReverseHead;
    }
};

合并两个排序的链表

题目:输入两个单调递增的链表,输出两个链表合成后的链表,当然我们需要合成后的链表满足单调不减规则。

思路:

/*
struct ListNode {
    int val;
    struct ListNode *next;
    ListNode(int x) :
            val(x), next(NULL) {
    }
};*/
class Solution {
public:
    ListNode* Merge(ListNode* pHead1, ListNode* pHead2){
        if (pHead1 == nullptr) return pHead2;
        else if (pHead2 == nullptr) return pHead1;
        ListNode* pMergedHead = nullptr;
        if (pHead1->val < pHead2->val){
            pMergedHead = pHead1;
            pMergedHead->next = Merge(pHead1->next, pHead2);
        }
        else{
            pMergedHead = pHead2;
            pMergedHead->next = Merge(pHead1, pHead2->next);
        }
        return pMergedHead;
    }
};

树的子结构

题目:输入两棵二叉树A,B,判断B是不是A的子结构。(ps:我们约定空树不是任意一个树的子结构)
思路:

/*
struct TreeNode {
    int val;
    struct TreeNode *left;
    struct TreeNode *right;
    TreeNode(int x) :
            val(x), left(NULL), right(NULL) {
    }
};*/

class Solution {
public:
    bool HasSubtree(TreeNode* pRoot1, TreeNode* pRoot2){
        bool res = false;
        if (pRoot1 != nullptr && pRoot2 != nullptr){
            if (pRoot1->val == pRoot2->val) res = DoesTree1HasTree2(pRoot1, pRoot2);
            if (!res) res = HasSubtree(pRoot1->left, pRoot2);
            if (!res) res = HasSubtree(pRoot1->right, pRoot2);
        }
        return res;
    }
private:
    bool DoesTree1HasTree2(TreeNode* pRoot1, TreeNode* pRoot2){
        if (pRoot2 == nullptr) return true;
        if (pRoot1 == nullptr) return false;
        if (pRoot1->val != pRoot2->val) return false;
        return DoesTree1HasTree2(pRoot1->left, pRoot2->left) && DoesTree1HasTree2(pRoot1->right, pRoot2->right);
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Matlab鲁棒性代码能够在不同环境、不同数据输入下保持稳定性和可靠性的代码。编写鲁棒性代码需要考虑到各种可能出现的情况,并针对性地处理这些情况,以确保程序能够正确运行并产生正确的结果。 首先,编写鲁棒性代码需要进行有效的输入检查和错误处理。在接受用户输入时,需要对输入进行验证,以防止不合法的输入导致程序出错。对于可能出现的错误情况,需要编写相应的错误处理代码,以确保程序在出现错误时能够恰当地处理并继续执行。 其次,对于可能出现异常的情况,也需要进行相应的处理。可能出现的异常包括数据缺失、数据格式错误、计算结果溢出等,需要编写相应的异常处理代码,以确保程序能够在出现异常时不崩溃,并进行合适的处理。 另外,编写鲁棒性代码还需要考虑到程序运行的环境和条件。在不同的操作系统、不同的 Matlab 版本下,可能会存在一些差异,需要对这些差异进行相应的处理,以确保程序能够在不同环境下正常运行。 总的来说,编写鲁棒性代码需要考虑到各种可能出现的情况,并针对性地进行有效的输入检查、错误处理和异常处理,同时兼顾不同的运行环境和条件,以确保程序能够保持稳定性和可靠性。这样的代码不仅能够降低程序出错的概率,还能够提高程序的可维护性和可移植性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值