# 刷题方法
- 五毒神掌(1题做5遍)
- 读题、思考(5分钟)
- 第1遍,直接看解法,比较解法优劣
- 第2遍,背诵、默写编码、调试、通过
- 第3遍,过一天再写
- 第4遍,过一周再写
- 第5遍,面试前再写
- 切题四步骤
- 审清题目、思考、询问面试官(2分钟)
- 思考多种解法(3分钟)时间、空间最优,渐进、加强
- 编码(手写)
- 测试(用例)
- 学习方式(Outliers)
- 切碎知识点 梳理主干、分支 知识大纲 分类回顾
- 刻意练习,过遍数(做透初中级题扎实基本功练习弱项)
- 寻求反馈,及时反馈、主动反馈(看评论、题解),被动反馈 CodeView
# 知识大纲
# 常用语法
# while
- 先判断后循环
- 不知道循环次数
格式: while(条件){
执行条件
}
(while不是条件判断,不转换布尔值,只条件判断)
while循环遵循的规则:只有条件成立时,循环才会执行
特别注意:在循环中,设定条件时,一定要注意别设置死循环(没有终点)
1
2
3
4
5
6
7
2
3
4
5
6
7
# do while
- 先循环后判断
- 不知道循环次数
格式: do{
执行程序
}while(条件)
do...while循环遵循的规则:
不管条件是否成立,都会先执行一次程序
执行完后,再判断条件是否循环
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
# for
- 先判断后执行
- 知道循环次数
格式: for(let 初始化变量;循环执行条件;变量如何变化){
执行程序
}
for循环遵循的规则:
只有条件成立时,循环才会执行
for循环是while循环的语法糖
他们两的功能完全一样。
//例子:
//首先它和forEach,forof一样不可以遍历对象
//解决办法:就是把对象先转化为数组类型- -
//有一个对象:
let obj={a:1,b:2,c:3}
//用Object.keys属性转化
let obj2=Object.keys(obj)
//最后就可以用来遍历了
for (let i=0;i<obj2.length;i++){
console.log(obj2[i])
}
//输出结果就能出来了,forEach,for of同理
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# forEach(可以三个参数,第一个是value,第二个是index,第三个是数组体)
- 定义:用于调用数组的每个元素,并将元素传递给回调函数
- 缺点:不能同时遍历多个集合,在遍历的时候无法修改和删除集合数据,
- 方法不能使用break,continue语句跳出循环,或者使用return从函数体返回,对于空数组不会执行回调函数
- 优点:便利的时候更加简洁,效率和for循环相同,不用关心集合下标的问题,减少了出错的效率
//我们先用它来遍历数组
let arry=[9,8,7,6,5,4]
array.forEach(function(value,index,arr){
console.log(value)
})
//输出结果为9 8 7 6 5 4
//首先有人疑问它能不能用来遍历对象(一开始我也不知道)?
//我们用它来遍历对象试试可不可以
let obj={a:1,b:2,c:3,d:4}
obj.forEach(function(value,index,oObj){
console.log(value)
}
//输出结果会是obj.forEach is not a function,
//所以forEach不可以遍历对象,这也是它和for in的一个区别
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# for in (它大部分用于遍历对象)
定义:用于循环遍历数组或对象属性,fot in循环里面的index是string类型的, 代码每执行一次,就会对数组的元素或者对象的属性进行一次操作
缺点:某些情况下,会出现随机顺序的遍历,因为里面的值是string类型,所以 增加了转换过程,因此开销较大
优点:可以遍历数组的键名,遍历对象简洁方便
//首先遍历对象
let person={name:"老王",age:23,city:"大唐"}
let text=""
for (let i in person){
text+=person[i]
}
输出结果为:老王23大唐
//其次在尝试一些数组
let array=[1,2,3,4,5]
for (let i in arry){
console.log(array[i])
}
//能输出出来,证明也是可以的
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# for of
- 定义:可遍历map,object,array,set string等)用来遍历数据,比如组中的值
- 优点:避免了for in的所有缺点,可以使用break,continue和return,不仅支持数组的遍历,还可以遍历类似数组的对象,支持字符串的遍历,最简洁,最直接的遍历数组的语法,支持map和Set对象遍历
- 缺点:不适用于处理原有的原生对象(原生对象是一个子集,包含一些在运动过程中动态创建的对象)
//遍历数组
let arr=["nick","freddy","mike","james"];
for (let item of arr){
console.log(item)
}
//暑促结果为nice freddy mike james
//遍历对象
let person={name:"老王",age:23,city:"唐山"}
for (let item of person){
console.log(item)
}
//我们发现它是不可以的
//但是它和forEach有个解决方法,结尾介绍
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# break 和 continue
- break 和 continue关键字都可以用在 for 和 while 循环结构中,表示跳出循环;
- break:直接跳出循环
- continue 语句用在循环结构内,用于跳过本次循环中剩余的代码,并在表达式的值为真时,继续执行下一次循环。
# 常用数学函数
# Math
Math.max() 函数返回一组数中的最大值。
Math.min() 返回零个或更多个数值的最小值。
Math.abs() Math.abs(x) 函数返回指定数字 “x“ 的绝对值
Math.floor() 返回小于或等于一个给定数字的最大整数
# 常用位运算
运算符 描述 运算规则
- & 与 两个位都为1时,结果才为1
或
- ^ 异或 两个位相同为0,相异为1
- ~ 取反 0变1,1变0
- ’<<‘ 左移 各二进制位全部左移若干位,高位丢弃,低位补0
- ‘>>’ 右移 各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃
- 左移运算符(<<) 定义: 将一个运算对象的各二进制位全部左移若干位,左边的二进制位丢弃,右边补0。 设 a=1010 1110,a = a<< 2 将a的二进制位左移2位、右补0,即得a=1011 1000。 若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。
- 右移运算符(>>) 定义: 将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。 例如:a=a>>2 将a的二进制位右移2位,左补0 或者 左补1得看被移数是正还是负。 操作数每右移一位,相当于该数除以2。
# 常用算法
# 双指针
- 对撞指针
什么时候你需要联想到对撞指针? 这里我给大家两个关键字——“有序”和“数组”。 没错,见到这两个关键字,立刻把双指针法调度进你的大脑内存。普通双指针走不通,立刻想对撞指针!
- N数之和
- 盛水最多的容器
- 快慢指针
- 环形链表
- 链表中环的入口节点
- 最长连续递增序列
- 固定间距指针
一次遍历 求链表中的中点
一次遍历 求链表的倒数第k个元素
固定窗口大小的滑动窗口