JS刷题总结
多总结,才能更好地进步,分享下最近的刷题总结给大家吧
关于缩减代码
1.善用js中的函数或者特性。
(迭代、解构、set等等)
// 使用箭头函数缩减代码
// 处理输入,可以用.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)); //
console.log(3 + ~~((5 - 3) / 2)); // // 因此在于其他操作符号想结合时候可以适当增加括号,例如求中位
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; //
5 ^ 5 ^ 6 ^ 6 ^ 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.剩下的能淘汰你的只有智力题了。
有些忘记了,暂时想到的先写这么多了,慢慢补充,有好的建议都可以发给我
JS刷题总结的更多相关文章
- 用js刷题的一些坑
leecode可以用js刷题了,我大js越来越被认可了是吧.但是刷题中会因为忽略js的一些特性掉入坑里.我这里总结一下我掉过的坑. 坑1:js中数组对象是引用对象 js中除了object还有数组对象也 ...
- js刷题:leecode 25
原题:https://leetcode.com/problems/reverse-nodes-in-k-group/ 题意就是给你一个有序链表.如1->2->3->4->5,还 ...
- JS、JAVA刷题和C刷题的一个很重要的区别
就是最近在做树方面的题时,发现JS和JAVA刷题和C刷题的一个很重要的区别就是传入null的区别 当遍历的时候,C传参数时可以传进去null的指针,因为递归进去,出来时,指针还是指着那个地方 但是JS ...
- leetcode刷题记录--js
leetcode刷题记录 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但 ...
- 在vscode中配置LeetCode插件,从此愉快地刷题
大家好,今早在B站看到up主的vscode里藏了leetcode插件,这才知道原来还有这款神器.但是没想到在用的时候遇到了一些麻烦,花了一点时间才解决.所以写这篇文章除了给大家安利这个好用的插件之外, ...
- Buu刷题
前言 希望自己能够更加的努力,希望通过多刷大赛题来提高自己的知识面.(ง •_•)ง easy_tornado 进入题目 看到render就感觉可能是模板注入的东西 hints.txt给出提示,可以看 ...
- 攻防世界Web刷题记录(新手区)
攻防世界Web刷题记录(新手区) 1.ViewSource 题如其名 Fn + F12 2.get post 3.robots robots.txt是搜索引擎中访问网站的时候要查看的第一个文件.当一个 ...
- 基于Typescript和Jest刷题环境搭建与使用
写在前面 前几个月在公司用vue3和ts写项目,想巩固一下基础,于是我想起了去年基于JavaScript和Jest搭建的刷题环境,不如,给它搞个加强版,结合Typescript和Jest 搞一个刷题环 ...
- LeetCode刷题系列
LeetCode 我们工作面试和提高自身数据结构和算法能力的时候往往需要刷刷题,我选择LeetCode是通过一个留学论坛了解的.专业,覆盖语种全面. 提前说说刷题的心得: 尽量手写代码,少使用IDE的 ...
随机推荐
- Treesoft数据库管理系统使用说明
数据列表页面有以下功能:1.直接新添数据行2.直接双击编辑数据3.勾选复制新增数据4.数据按字段排序5.数据列过滤6.结果结果集过滤7.导出数据等 表结构设计页面有以下功能:1.直接新增.删除字段2. ...
- 在 HTML5 中捕获音频和视频
简介 长久以来,音频/视频捕获都是网络开发中的"圣杯".多年来,我们总是依赖于浏览器插件(Flash 或 Silverlight)实现这一点.快来看看吧! 现在轮到 HTML5 大 ...
- Memcached修改默认端口
windows下修改memcached服务的端口号(默认端口:11211)如果不是作为服务启动memcached的话,memcached -p 端口号就可以了. 通过修改注册表可以简单实现 运行:re ...
- 使用证书创建request请求
之前写过的程序,都是普通http request. 这是第一次使用,记录下. private static X509Certificate2 GetCert(string certId,StoreLo ...
- Python 3.6.4 / win10 使用pip安装keras时遇到依赖的PyYAML安装出错
PS C:\Users\myjac\Desktop\simple-chinese-ocr> pip install keras Collecting keras Downloading http ...
- delphi XE Datasnap SERVER 在windows 7 下为服务添加描述信息
网上对服务添加描述信息的,多数是用注册表的方式,而注册表的方式,我在win7 下测试,不知为什么,总是不行,把执行的CMD以管理员模式开启,还是没加进去. 于是在网上查到下面的代码,保存供叁考,原文博 ...
- 归档日志空间满导致DB启动失败
现象 登录失败 告警日志: 由此可知,归档日志空间已满 解决方式: 一.增大归档日志空间 1.启动数据库至nomount [oracle@CentOS ~]$ sqlplus / as sysdba ...
- [模拟赛] T3 Exploit
Description 4X概念体系,是指在PC战略游戏中一种相当普及和成熟的系统概念,得名自4个同样以"EX"为开头的英语单词. eXplore(探索) eXpand(拓张与发展 ...
- Vue:渲染、指令、事件、组件、Props、Slots
如果要我用一句话描述使用 Vue 的经历,我可能会说“它如此合乎常理”或者“它提供给我需要的工具,而且没有妨碍我的工作”.每当学习 Vue 的时候,我都很高兴,因为很有意义,而且很优雅. 以上是我对 ...
- Python中四种样式的99乘法表
1.常规型. #常规型 i=1 while i<=9: j=1 while j<=i: print(''%d*%d=%2d''%(i,j,i*j),end='') i+=1 #等号只是用来 ...