文章目录
- 引言
- 新做
- 删除有序数组中的重复项
- 个人实现
- K 个一组翻转链表
- 个人实现
- 参考代码
- 总结
引言
- 上午完全去听讲座了,听了三场,拿了三个讲座单,从九点一直到十二点。笔记本电脑插电才能用,就没带,所以没有进行复习。只有晚上的新作。
新做
删除有序数组中的重复项
- 题目链接
个人实现
- 非严格递增序列,原地删除重复出现的元素,每一个元素只出现一次
- 元素的相对顺序保持一致,返回nums中唯一元素的个数
要求 - 前k个元素包含唯一的元素,其余的元素与nums大小不重要
- 返回K
这个题目注意
- 和之前的一样,这道题要看清楚,我就觉得奇怪,原来他妈的昨天做过了,我靠。
具体实现
- index,不同的元素复制过来,如果相同的元素直接跳过。
class Solution {
public:
int removeDuplicates(vector<int>& nums) {
int idx = 0;
for (int i = 0; i < nums.size(); ) {
nums[idx] = nums[i];
idx ++ ,i ++;
while(i < nums.size() && nums[i] == nums[i - 1]) i ++;
}
return idx;
}
};
K 个一组翻转链表
个人实现
-
拆解问题,这个可以拆解成子链表反转 + 遍历到第K个链表。
-
子链表反转
- 三个指针节点a,b,c。然后交换a和b,使用c记录对应的下一个链表的内容
-
遍历k个链表
- 使用k进行遍历,然后获取对应的值,这个主要是获取需要改变的头结点,然后在进行遍历
-
有点心神不宁,有点烦躁,不是很想写了,有点烦,所以暂时就这样吧。
-
卡在了怎么保证找到第k个节点的头节点是啥
下述代码没有调整过,只是有点心神不宁,心烦意乱,内心难以平静
- 总的来说,大概逻辑是实现的,但是没有调通。
ListNode* reverseKGroup(ListNode* head, int k) {
int idx = 0;
auto dummy = new ListNode();
dummy->next = head;
// 这里是要遍历k次,然后再往后进行遍历
auto l = dummy,r = dummy;
while (r){
r = r->next,idx ++;
if (idx == k - 1) {
auto a = l,b = l->next,c = l->next->next;
do {
b->next = a;
c = c->next;
a = b;
b = c;
}while(c == r);
idx = 0;
l = r;
}
}
}
参考代码
思路分析
- 他是从整体的角度出发的,具体步骤如下
- 先是交换的邻接节点的指针,让他反转
- 然后在交换的对应的头结点,保证首尾节点的连接相关性
具体步骤如下
- 先往后遍历k次 ,如果可以的话,就跳过
- 然后更换对应的邻接节点的指针
ListNode* reverseKGroup(ListNode* head , int k){
auto dummy = new ListNode(-1);
dummy->next = head;
for (auto p = dummy;;) {
// 这里是向后遍历k次,判定当前这个阶段能否进行遍历
auto q = p;
for (int i = 0; i < k && q; ++i) q = q->next;
if (!q) break;
// 定义邻接节点反转指针
auto a = p->next ,b = a->next;
for (int i = 0; i < k - 1; ++i) {
// 保存b的后继节点
auto c = b->next;
// 反转b的next节点方向
b->next = a;
// 然后的三个指针向后迁移
a = b,b = c;
}
// 反转首尾节点的指向
auto c = p->next;
p->next = a,c->next = b;
p = c;
}
return dummy->next;
}
总结
- 昨天就做了一道题,两道题,拖到了今天早上才发,不行呀!不过昨晚,解决了我内心的一根刺,心情好了很多的。
- 继续加油!