劍指Offer題解合集

sleeeeeping發表於2024-07-29

劍指Offer題單及題解

題目順序為牛客上劍指Offer專題

JZ3、陣列中重複的數字

分析

可以直接對陣列進行排序,透過判斷首末數字大小來判斷數字越界情況,注意陣列為空的情況。發現 \(0 \leq nums[i] \leq n - 1\), 因此直接開一個陣列判斷是否有重複數字即可,返回第一個重複數字。

程式碼實現

class Solution {
public:
    int duplicateInArray(vector<int>& nums) {
        int n = size(nums);
        std::sort(nums.begin(), nums.end());
        if (n == 0 || nums.back() > n || nums[0] < 0) {
            return -1;
        }
        std::vector<int> buc(n);
        for (auto x : nums) {
            buc[x] += 1;
            if (buc[x] > 1) {
                return x;
            }
        }
        return -1;
    }
};

JZ5。替換空格

分析

直接呼叫std::string中的replace方法替換 即可。

程式碼實現

class Solution {
public:
    string replaceSpaces(string &str) {
        for (int i = 0; i < size(str); ++i) {
            if (str[i] == ' ') {
                str.replace(str.begin() + i, str.begin() + i + 1, "%20");
            }
        }
        return str;
    }
};

JZ6、從尾到頭列印連結串列

分析

直接遍歷連結串列,將連結串列中的資料存入vector,最後reverse一下返回即可。

程式碼實現

/**
 * Definition for singly-linked list.
 * struct ListNode {
 *     int val;
 *     ListNode *next;
 *     ListNode(int x) : val(x), next(NULL) {}
 * };
 */
class Solution {
public:
    vector<int> printListReversingly(ListNode* head) {
        std::vector<int> ans;
        while (head != nullptr) {
            ans.push_back(head->val);
            head = head->next;
        }
        std::reverse(ans.begin(), ans.end());
        return ans;
    }
};

JZ7、二叉樹的下一個節點

分析

可以分為兩種情況討論:

  • 情況1:當前節點的右節點不為空,則下一個節點為其右子樹的左子樹的最下面的節點
  • 情況2:當前節點的右節點為空,則下一個節點為其右子樹祖先節點第一個存在右子樹節點

程式碼實現

/**
 * Definition for a binary tree node.
 * struct TreeNode {
 *     int val;
 *     TreeNode *left;
 *     TreeNode *right;
 *     TreeNode *father;
 *     TreeNode(int x) : val(x), left(NULL), right(NULL), father(NULL) {}
 * };
 */
class Solution {
public:
    TreeNode* inorderSuccessor(TreeNode* p) {
        if (p->right != nullptr) {
            p = p->right;
            while (p->left != nullptr) {
                p = p->left;
            }
            return p;
        }
        while (p->father != nullptr && p->father->right == p) {
            p = p->father;
        }
        return p->father;
    }
};

未更完...

相關文章