# 刷题方法

  • 五毒神掌(1题做5遍)
    1. 读题、思考(5分钟)
    2. 第1遍,直接看解法,比较解法优劣
    3. 第2遍,背诵、默写编码、调试、通过
    4. 第3遍,过一天再写
    5. 第4遍,过一周再写
    6. 第5遍,面试前再写
  • 切题四步骤
    1. 审清题目、思考、询问面试官(2分钟)
    2. 思考多种解法(3分钟)时间、空间最优,渐进、加强
    3. 编码(手写)
    4. 测试(用例)
  • 学习方式(Outliers)
    1. 切碎知识点 梳理主干、分支 知识大纲 分类回顾
    2. 刻意练习,过遍数(做透初中级题扎实基本功练习弱项)
    3. 寻求反馈,及时反馈、主动反馈(看评论、题解),被动反馈 CodeView

# 知识大纲

# 常用语法

# while

  1. 先判断后循环
  2. 不知道循环次数
格式: while(条件){
     执行条件
    }while不是条件判断,不转换布尔值,只条件判断)
    while循环遵循的规则:只有条件成立时,循环才会执行
特别注意:在循环中,设定条件时,一定要注意别设置死循环(没有终点)

1
2
3
4
5
6
7

# do while

  1. 先循环后判断
  2. 不知道循环次数
    格式: do{
             执行程序
           }while(条件)
  
    do...while循环遵循的规则:           
     不管条件是否成立,都会先执行一次程序
     执行完后,再判断条件是否循环

1
2
3
4
5
6
7
8

# for

  1. 先判断后执行
  2. 知道循环次数
格式: 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

# 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

# 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

# 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

# break 和 continue

  1. break 和 continue关键字都可以用在 for 和 while 循环结构中,表示跳出循环;
  2. break:直接跳出循环
  3. 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,右边丢弃
  1. 左移运算符(<<) 定义: 将一个运算对象的各二进制位全部左移若干位,左边的二进制位丢弃,右边补0。 设 a=1010 1110,a = a<< 2 将a的二进制位左移2位、右补0,即得a=1011 1000。 若左移时舍弃的高位不包含1,则每左移一位,相当于该数乘以2。
  2. 右移运算符(>>) 定义: 将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。 例如:a=a>>2 将a的二进制位右移2位,左补0 或者 左补1得看被移数是正还是负。 操作数每右移一位,相当于该数除以2。

# 常用算法

# 双指针

  • 对撞指针

什么时候你需要联想到对撞指针? 这里我给大家两个关键字——“有序”和“数组”。 没错,见到这两个关键字,立刻把双指针法调度进你的大脑内存。普通双指针走不通,立刻想对撞指针!

  1. N数之和
  2. 盛水最多的容器
  • 快慢指针
  1. 环形链表
  2. 链表中环的入口节点
  3. 最长连续递增序列
  • 固定间距指针
  1. 一次遍历 求链表中的中点

  2. 一次遍历 求链表的倒数第k个元素

  3. 固定窗口大小的滑动窗口

# 递归