劍指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;
}
};
未更完...