1. {} > Set > Map
2. js代码实现的运算 > Math函数 > 位运算
3. 时间复杂度 m层循环O(n的m次方) > 1层循环加不到1层循环O(n * log n) > 1层循环O(n) > 不到1层循环-2分法O(log n) > 位运算O(1)
4. 空间复杂度 递归、循环中定义变量O(n) > 不到1层循环中定义变量O(log n) > 在循环外定义变量O(1)
5. 如果对象的key不是很多,或者取对象值的深度不是很深,使用.或者[]取引用变量的属性值不会增加时间复杂度,并且会减少空间复杂度。
6. 如果能找到数学公式的规律,可以减少循环次数。
7. 掌握常见类型的算法,并把题目转换成对应类型的结构,如回溯、贪心、滑动窗口、背包、数列、动态规划
8. for(let i=0;) 和 for(const x in nums) 速度差不多
9. 减少循环层级-break < 减少循环次数-break < 减少循环内执行代码 < 优化执行顺序
10. 使用typescript在leetcode上提交代码时的执行用时和消耗内存不是很准,可以自己在本地执行用例
11. i !== 999 慢于 i < 1000
12. i < 1000 等于 i <= 999
13. 二分查询 Math.floor(high + low + 1) / 2 慢于 Math.floor((high - low + 1) / 2) + low 差距5%
14. 速度上 i++ 等于 ++i
15. while(node) 慢于 while(node !== null)
16. i-- 慢于 i >>>= 1
17. i++ 慢于 i <<= 1
18. bits >>= 1 等于 bits >>>= 1
19. String(Number(1000)) 慢于 Number(1000).toString()
19. `${startNumber.toString()}-${endNumber.toString()}` 慢于 `${startNumber}-${endNumber}` 差距45倍
20. `${startNumber}-${endNumber}` 等于 startNumber + "-" + endNumber 耗时相同
21. const numsLength = nums.length; for(let i=0; i < numsLength; i++) 等于 for(let i=0; i < nums.length; i++)
22. [0] 慢于 new Array(n + 1).fill(0) 差距2.5倍
23. ["a", "e", "i", "o", "u"].includes(char) 慢于 "aeiou".includes(char) 差距1.8倍
24. vowels.includes(s[rightIndex]) 等于 vowels.indexOf(s[leftIndex]) > -1
25. Math.sqrt(num) 非常快,时空复杂度与 CPU 支持的指令集相关,比一般循环的求解快100倍
26. 2的n次幂 慢于 n平方 慢于 n * logn 慢于 n 慢于 sqrt(n) 慢于 logn
27. 对象数组 慢于 字符串数组 慢于 单个字符数组
#### 参与贡献
1. 求一个数的二进制,可以用 (n & (n - 1)) === 0 或者 (n & (-n)) === n
const startTime = Date.now();
for (let i = 0; i < 100000000; i++) {
titleToNumber("A"); //1
titleToNumber("AB"); //28
titleToNumber("AZ"); //52
titleToNumber("ZY"); //701
titleToNumber("FXSHRXW"); //2147483647
}
console.log(Date.now() - startTime);