快慢指针
141.环形链表
给你一个链表的头节点 head ,判断链表中是否有环。
因为fast指针一次走两步,注意判断条件
while(fast!=null && fast.next!=null)
判断是否同一个节点slow == fast
142.环形链表 II
给定一个链表,返回链表开始入环的第一个节点。 如果链表无环,则返回 null。
以前使用python的解析:
fast和slow第一次在环内相遇。
slow1在头结点开始和slow继续环内移动,第二次在环入口相遇。
至于为什么第二次相遇就是在环入口,查看链接的数学解释。
876.链表的中间结点
给定一个头结点为 head 的非空单链表,返回链表的中间结点。
19.删除链表的倒数第 N 个结点
给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。
因为要删除节点,所以找的是倒数第N个节点的前一个节点,所以快的节点不再是移动到null。while(j.next)
不同于剑指 Offer 22. 链表中倒数第k个节点。
左右指针
167.两数之和 II - 输入有序数组
numbers 的下标 从 1 开始计数 ,所以答案数组应当满足 1 <= answer[0] < answer[1] <= numbers.length
拓展题:1. 两数之和
给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标值 target 的那 两个 整数,并返回它们的数组下标。
方法:我们遍历到数字 aa 时,用 targettarget 减去 aa,就会得到 bb,若 bb 存在于哈希表中,我们就可以直接返回结果了。若 bb 不存在,那么我们需要将 aa 存入哈希表,好让后续遍历的数字使用。
你可以使用对象{}数据结构,也可以使用Map数据结构,两者的区别,该题执行用时是一样的。
344.反转字符串
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
通过解构赋值,可以直接交换两个数
[s[le],s[ri]] = [s[ri],s[le]];
W3C数组的方法
拼接数组 splice() 方法可用于向数组添加新项。
合并(连接) 数组concat() 方法通过合并(连接)现有数组来创建一个新数组。
裁剪数组 slice() 方法用数组的某个片段切出新数组。
W3C数组的方法
数组排序 sort() 方法以字母顺序对数组进行排序。默认地,sort() 函数按照字符串顺序对值进行排序。
反转数组 reverse() 方法反转数组中的元素。
比值函数修正sort()方法
升序排序
var points = [40, 100, 1, 5, 25, 10];
points.sort(function(a, b){return a - b});
比值函数: 比较函数的目的是定义另一种排序顺序。比较函数应该返回一个负,零或正值。
对数组使用 Math.max()
您可以使用 Math.max.apply 来查找数组中的最高值。
Math.max.apply([1, 2, 3])
等于 Math.max(1, 2, 3)
。
滑动窗口算法
这也许是双指针技巧的最高境界了,如果掌握了此算法,可以解决一大类子字符串匹配的问题。在下一节涉及。