文章目录
- 引言
- 新做
- 删除有序数组中的重复项
- 个人实现
- 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;
}
总结
- 昨天就做了一道题,两道题,拖到了今天早上才发,不行呀!不过昨晚,解决了我内心的一根刺,心情好了很多的。
- 继续加油!