JS刷题总结

多总结,才能更好地进步,分享下最近的刷题总结给你们吧
关于缩减代码 1.善用js中的函数或者特性。
(迭代、解构、set等等)php

//使用箭头函数缩减代码
//处理输入,能够用.map,须要注意其全部参数
//此外其余迭代方法也须要掌握。
let line=readline().split(" ");
line=line.map(e=>parseInt(e));

//去重
arr=[...new Set(arr)];
//升序,排序能够用sort,默认是字典序,而且能够根据须要定制,须要深刻掌握
arr.sort((a,b)=>a-b);
//迭代输出
arr.forEach(i=>console.log(i));
//求最大值,使用扩展运算符...
max=Math.max.call(...arr);
// 复制数组 
arr2=[...arr1];
arr2=arr.concat();
arr2=arr.slice();

//善用解构
//变量赋值
let [a,b,c,d,e]=[1,2,3,4,5];//a=1,b=2,c=3,d=4,e=5
//交换变量值
[a,b]=[b,a]; 

//题外话:字符串中的字符是没法交换的
let str="ab";
[str[0],str[1]]=[str[1],str[0]];//无效,"ab"
//不过能够将字符串拆成字符数组后就能够交换了
str=str.split("");//["a","b"]
[str[0],str[1]]=[str[1],str[0]];//["b","a"]

 
2.善用位运算。
(相信我,能用位运算的就用位运算)正则表达式

//求数组一半长度
halfLen=a.length>>1;

// 不过须要注意右移运算符>>优先级别加号+还低,例如
console.log(3+((5-3)>>1));//2
console.log(3+~~((5-3)/2));//4

//所以在于其余操做符号想结合时候能够适当增长括号,例如求中位
mid = left + ((right - left)>>1);
mid = left + ~~((right - left)/2);
//不建议使用mid = (left + right)>>1;,由于加号操做可能形成溢出

//~~等价于Math.floor(),|0也等价于Math.floor()
halfLen=~~(a.length/2);
halfLen=(a.length/2)|0;

// 判断奇偶
evenNum&1==0;//偶数
oddNum&1==1;//奇数

//善用异或
5^5=0
5^5^6^6^7=7

//判断数是不是2的幂次方
num & num-1 == 0;

//翻转数的第K位
num ^= (1 << k);

//将第K位设为0
num &= ~(1 << k);

//将第K位设为1
num |= (1 << K);

//判断第K位是否为0
num & (1 << k) == 0;

 
 
3.善用正则表达式。
(只要关于字符串的题目都应该联想到用正则表达式)
要会写正则,能够用正则表达式的几个函数也要掌握
正则中:exec,test
字符串中:search,match,replace,split
具体例子能够看个人:百词斩春招笔试题解
 
4.少写函数。
刷题不是写业务代码,没有说要封装重用,AC才是王道。
而且写函数还要思考须要哪些参数,参数如何传递,会影响思考速度。
咱们尽可能作到的是,思考清楚后直接敲,越快越好,而不是一遍敲一边思考。
 
5.递归函数。
前面状况有例外,好比要写递归,就要写函数。递归函数能够减小代码。
不过仍是建议用递归思想去想,用循环搭配数据结构(栈/队列)去解答
 
关于刷题方法 1.审题先判断陷阱。
看到题目第一先看是否有时间复杂度、空间复杂度的要求。(好比大数问题、递归多了栈溢出等问题)
根据本身猜想判断使用简单方法,仍是复杂方法来作,毕竟咱们没有时间去作两遍题目。
而后再顺便看下是否须要判断边界条件(通常都须要出错判断)
有时间复杂度要求的,能够优化排序、动态规划、以空间换时间等
有空间复杂度要求的,能够用循环代替递归、动态规划代替递归等
这里讲下为何不说贪心,第一理论上全部贪心能够解决的问题均可以用动态规划来作,第二正因如此,许多公司难题也就只考到了动态规划。
因此请必定必定要掌握动态规划。
 
2.联想。
咱们遇到题目时要把题目和之前作过的题联想下,经过相似点,找出突破点。
字符串问题====》正则
链表、数组问题====》双指针
数组问题====》利用数组下标来作====》有时须要额外数组==》此外大部分要考虑二分法优化时间复杂度
多维数组问题====》降维来作。
复杂问题、优化问题====》动态规划
排列问题====》递归、回溯
数论问题====》找规律、动态规划
树的问题====》递归、深度遍历、广度遍历====》栈、队列
次数问题====》哈希表存储(js中建议使用{},而不要使用ES6中的Map)
大小值问题====》栈、队列、哈希表作存储
从前日后、从大到小比较复杂====》从后往前、从小到大思考。
动态规划重点了解
位运算也了解一下
 
3.必须掌握算法
快排和归并排序、深度和广度遍历、二分查找(能手撕)
动态规划、回溯法。
要专门根据题目分类去刷这些算法。
 
4.多画图。
对于涉及数据结构的题目,如链表、二叉树等必定要画图。
对于涉及几率的问题,能够画圈圈来交、并、补。
对于点线的问题,能够画坐标系。
 
5.多举例
对于复杂问题能够举不复杂的小例子来分析步骤。
对于数论问题能够举例子来找规律。
退一万步来讲,假设你实在不会作,你也能够经过举例,本身if-else生产不少测试用例去知足题意。
这也是为何咱们刷题时,题目不会像剑指offer题目同样,告诉你的答案和题目的测试用例有哪些不一样的缘由。
 
6.剩下的能淘汰你的只有智力题了。
 
 
有些忘记了,暂时想到的先写这么多了,慢慢补充,有好的建议均可以发给我
 
转载于猿2048:➬《JS刷题总结》算法

相关文章
相关标签/搜索