前言
一个本硕双非的小菜鸡,备战24年秋招,计划刷完hot100和剑指Offer的刷题计划,加油!
根据要求,每一道题都要写出两种以上的解题技巧。
一、189. 轮转数组(HOT100)
189. 轮转数组
Note:
首先对整个数组实行翻转,这样子原数组中需要翻转的子数组,就会跑到数组最前面。
这时候,从 k 处分隔数组,左右两数组,各自进行翻转即可。
class Solution {
public:
void reverse(vector<int>& nums, int start, int end) {
while (start < end) {
swap(nums[start], nums[end]);
start++;
end--;
}
}
void rotate(vector<int>& nums, int k) {
k %= nums.size();
reverse(nums, 0, nums.size() - 1);
reverse(nums, 0, k - 1);
reverse(nums, k, nums.size() - 1);
}
};
Note:
使用额外的数组来将每个元素放至正确的位置。用 size 表示数组的长度,我们遍历原数组,将原数组下标为 i 的元素放至新数组下标为 (i+k) mod n的位置,最后将新数组拷贝至原数组即可。
class Solution {
public:
void rotate(vector<int>& nums, int k) {
int size = nums.size();
vector<int> newArr(size);
for (int i = 0; i < size; ++i) {
newArr[(i + k) % size] = nums[i];
}
nums.assign(newArr.begin(), newArr.end());
}
};
二、24. 反转链表(剑指Offer)
24. 反转链表
Note:双指针,一个记录后一个链表节点,一个记录当前节点。
然后改变链表的next指针的指向,直接将链表反转。
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverseList(ListNode* head) {
ListNode* tmp;
ListNode* cur = head;
ListNode* pre = NULL;
while (cur) {
tmp = cur->next;
cur->next = pre;
pre = cur;
cur = tmp;
}
return pre;
}
};
Note:递归解题
和双指针法初始化是一样的逻辑
/**
* Definition for singly-linked list.
* struct ListNode {
* int val;
* ListNode *next;
* ListNode() : val(0), next(nullptr) {}
* ListNode(int x) : val(x), next(nullptr) {}
* ListNode(int x, ListNode *next) : val(x), next(next) {}
* };
*/
class Solution {
public:
ListNode* reverse(ListNode* pre, ListNode* cur) {
if (cur == NULL) return pre;
ListNode* temp = cur->next;
cur->next = pre;
return reverse(cur, temp);
}
ListNode* reverseList(ListNode* head) {
return reverse(NULL, head);
}
};
总结
祝大家都能学有所成,找到一份好工作!