按知识点刷题
Posted Coding With you.....
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了按知识点刷题相关的知识,希望对你有一定的参考价值。
一、链表
1.牛客剑指offer 剑指Offer_在线编程+题解_牛客题霸_牛客网
内容在博客上
2.一个网站 CS-Notes
剑指:
6. 交换链表中的相邻结点
思路:
递归:当节点.next不为空时,节点与next交换;下一个遍历的是节点.next.next
tip:不递归直接遍历
while (pre.next != null && pre.next.next != null)
7. 链表求和
思路:
将链表进行反转-这样可以直接next进行相加以及进位的保存,当遍历到其中一个链表为空时,另一个链表只考虑自己和进位之和的相加来更新节点的val
- head保存当前已经计算的值,node是当前节点-new的时候值为进位后对10取余;
- node的next指向head的next——head的next是计算的后几位,head是空
- 然后head.next=node就是head一直是保存已经计算的值 且第一个是空指针
tip:因为不能改变链表的原始结构,所以采用两个栈进行计算
8. 回文链表
思路:
- 等于空返回false;等于1返回TRUE;其他情况:先计算链表长度,然后创建两个链表,
- 后一个指针先走ceil(长度/2)步
- 然后前一个指针和后一个指针同时走知道指针二为空,每一个值保存到一个链表中
- 将其中一个链表反转看他两是否相等 空间复杂度是n
tip:返回时Listnode数组,所以数组中保存的是节点,其中每一个到长度后一定要使其指向空
- 不需要计算长度,设置一个快指针和一个慢指针,当快指针走到结尾时慢指针走到了中间,其后面的是后一半部分
- 将前半部分的最后一个的next指向空,后半部分从慢指针指向的列表反转
- 如果两个链表的每一位都对等,那么就是回文的 否则不是
9. 分隔链表
题目描述:把链表分隔成 k 部分,每部分的长度都应该尽可能相同,排在前面的长度应该大于等于后面的。
思路:首先计算链表的长度,然后与k取整为后面每一组数量,取余+取整为第一组的数量
然后就是遍历链表:首先遍历取出第一组的来,然后每循环取整次,就保存到下一组
使用两层for循环就行
tip:不是将余数都放在第一个链表中,而是每一个数组中填1个,直到填完为止 这个超级棒哦
组数确定,但是每一组里面的长度是在每次遍历的时候确定的
10. 链表元素按奇偶聚集
思路:加一个头指针,采用两个指针,一个指向奇数值的节点,一个指向偶数值的节点;奇数节点比偶数节点早一步,然后两个同步走;
当偶数节点遇到偶数的时候,如果奇数节点指向奇数,那么他两交换;如果奇数节点指向偶数,那么奇数继续向后走直到奇数才交换 当奇数到达最后为null时结束
tip:官方的比较简单,因为已知的是奇偶表,所以1,3,5等位置为奇数,2,4,6为偶数,不需要去拿指针寻找,直接next=next.next就可以
6. 交换链表中的相邻结点
思路:
递归:当节点.next不为空时,节点与next交换;下一个遍历的是节点.next.next
tip:不递归直接遍历
6. 交换链表中的相邻结点
思路:
递归:当节点.next不为空时,节点与next交换;下一个遍历的是节点.next.next
tip:不递归直接遍历
leecode:
6. 交换链表中的相邻结点
思路:
递归:当节点.next不为空时,节点与next交换;下一个遍历的是节点.next.next
tip:不递归直接遍历
6. 交换链表中的相邻结点
思路:
递归:当节点.next不为空时,节点与next交换;下一个遍历的是节点.next.next
tip:不递归直接遍历
3.代码随想录代码随想录
二、数组
二分查找涉及的很多的边界条件,逻辑比较简单,但就是写不好。例如到底是 while(left < right)
还是 while(left <= right)
,到底是right = middle
呢,还是要right = middle - 1
呢?
写二分法,区间的定义一般为两种,左闭右闭即[left, right],或者左闭右开即[left, right)。
第一种写法,我们定义 target 是在一个在左闭右闭的区间里,也就是[left, right] ,区间的定义这就决定了二分法的代码应该如何写,因为定义target在[left, right]区间,
- while (left <= right) 要使用 <= ,因为left == right是有意义的,所以使用 <=
- if (nums[middle] > target) right 要赋值为 middle - 1,因为当前这个nums[middle]一定不是target,那么接下来要查找的左区间结束下标位置就是 middle - 1
第二种写法:如果说定义 target 是在一个在左闭右开的区间里,也就是[left, right)
- while (left < right),这里使用 < ,因为left == right在区间[left, right)是没有意义的
- if (nums[middle] > target) right 更新为 middle,因为当前nums[middle]不等于target,去左区间继续寻找,而寻找区间是左闭右开区间,所以right更新为middle,即:下一个查询区间不会去比较nums[middle]
1.代码随想录
6. 交换链表中的相邻结点
思路:
递归:当节点.next不为空时,节点与next交换;下一个遍历的是节点.next.next
tip:不递归直接遍历
6. 交换链表中的相邻结点
思路:
递归:当节点.next不为空时,节点与next交换;下一个遍历的是节点.next.next
tip:不递归直接遍历
6. 交换链表中的相邻结点
思路:
递归:当节点.next不为空时,节点与next交换;下一个遍历的是节点.next.next
tip:不递归直接遍历
以上是关于按知识点刷题的主要内容,如果未能解决你的问题,请参考以下文章