正无穷:Infinity
金额格式化:利用字符串提供的toLocaleString()方法处理。有时候不生效,比如app
数字容错:if(!Number.isFinite(num)){ //不是数字}
头部添加unshift 、尾部增加push、首部删除shift、尾部删除pop
slice()通过索引位置获取新的数组,该方法不会修改原数组,只是返回一个新的子数组。(浅拷贝) 简单数组隔离得这么处理
s.slice(-b),返回尾部b个,slice(0,-b),返回截取b之前的
reduce:数组为0报错,arr.reduce((pre,cur)=>pre+cur,0)
substr(start,len)
substring(start,end)
小写:toLowerCase;大写:toUpperCase();
endsWith是否以某个字符串结尾
substring 它是将在string末尾搜索的字符集。
length 选修的。它是将被搜索的字符串的长度。如果未提供此参数,则endsWith() 方法将搜索字符串的全长。
String.charCodeAt(index) 返回指定位置的字符的编码
String.charAt(index) 返回字符串中指定位置的字符
String.fromCharCode(n1, n2, …, nX) 接受一个指定的 Unicode 值,然后返回一个字符串
str.padStart(targetLength [, padString])在字符串的开头进行字符补全
padEnd(len,str)用于尾部补全
let str = “qwertyuasdfghjzxcvbn”;
str = […str].sort((a,b)=>{
return a.localeCompare(b,“zh-CN”)
}).join(“”)
parseInt 将字符串自动转成整数,开头结尾允许空格,第一个数字会被返回,第一个字符不能转成数字,返回NaN
parseFloat 将字符串自动转成数字,开头结尾允许空格,第一个数字会被返回,第一个字符不能转成数字,返回NaN
Number 不能整体转成,返回NaN
堆栈:后进先出,队列:先进先出
堆栈:插入删除都发生在top端,队列:插入发生在rear端,删除发生在front端
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-R9M84Di7-1692627240123)(C:\Users\syhgly\AppData\Roaming\Typora\typora-user-images\1676441999210.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SxfbBtV6-1692627240124)(C:\Users\syhgly\AppData\Roaming\Typora\typora-user-images\1676442057388.png)]
栈和堆的关系:基础变量的值是存储在栈中,而引用变量存储在栈中的是指向堆中的数组或者对象的地址,这就是为何修改引用类型总会影响到其他指向这个地址的引用变量。(线性结构,后进先出)
call 、bind 、 apply 这三个函数的第一个参数都是 this 的指向对象
第二个参数,call-a,b bind-是函数、bind(db,[])(),apply-数组
Math.min.call(null,…array)
比如求 x,y的最大公约数和最小公倍数
记住这个公式: xy=最小公倍数最大公约数
求最大公因数公式
https://blog.csdn.net/wyh_ty/article/details/105949789
let num =180
let res = '', k = Math.sqrt(num)
for(let i = 2 ; i <= k ; i++) {
while(num % i === 0) {
res += i + ' '
num = num / i
}
}
// 如果num最后不是1,则说明此时num也是一个质数,需要添加到最后
if(num !== 1) {
res += num
}
console.log(res)
Math.floor(Math.random()*num)(随机产生0-num之间的整数不包括num)
核心思想是:将大问题划分为小问题进行解决,从而一步步获取最优解的处理算法
适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。 ( 即下一个子阶段的求解是建立在上一个子阶段的解的基础上,进行进一步的求解 )
// 如果求组合数就是外层for循环遍历物品,内层for遍历背包。-- 购物单
// 如果求排列数就是外层for遍历背包,内层for循环遍历物品。
1.数组dp以及下标含义
2.逆推公式
3.dp数组如何初始话
4遍历顺序
5.循环打印数组
它包含这样三个步骤:
分解: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jZtyRM1l-1692627240125)(C:\Users\syhgly\AppData\Roaming\Typora\typora-user-images\1678965608618.png)]
解决: 使用归并排序递归地排序两个子序列
合并: 把两个已经排好序的子序列 [l, m][l,m] 和 [m + 1, r][m+1,r] 合并起来
在待排序序列长度为 11 的时候,递归开始「回升」,因为我们默认长度为 11 的序列是排好序的。
1< /s空白字符 +1或多个 DFS:深度优先搜索算法,就是一条路走到黑的算法,走不通了就往回走(一种一种的尝试,在把所有可能情况尝试) 解决的问题 如果只是要找到某一个结果是否存在,那么DFS会更高效。因为DFS会首先把一种可能的情况尝试到底,才会回溯去尝试下一种情况,只要找到一种情况,就可以返回了。但是BFS必须所有可能的情况同时尝试,在找到一种满足条件的结果的同时,也尝试了很多不必要的路径 BFS:宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一 系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止.空间复杂度为o(2^n) 回溯算法 回溯是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法 中序遍历 中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。若二叉树为空则结束返回 匈牙利算法(Hungarian algorithm)。 匈牙利算法主要用于解决一些与二分图匹配有关的问题。 二分图(Bipartite graph)是一类特殊的图,它可以被划分为两个部分,每个部分内的点互不相连。 使用场景:求二分图的最大匹配数和最小点覆盖数。 滑动窗口 我们在字符串 S 中使用双指针中的左右指针技巧,初始化 left = right = 0,把索引闭区间 [left, right] 称为一个「窗口」。 二维数组创建坑 new Array(3).fill( new Array(4).fill(0)) (指向的是索引) Array.from(Array(3), () => Array(4).fill(0)) 这种不会出现联动问题 new Array(2).fill(0).map(() => new Array(3).fill(0)) 数组转map new Map(array) map转数组 […map] 循环map for(let [key,value] of map.entries()) 数组转set new Set(array) set转数组 […set] ||Array.from(set) 循环对象 方法1:for (let [key,value] of Object.entries(obj)) 方法2: for(let key in obj) key obj[key] 对象转数组:Object.entries(obj) 数组转字符串 String(arr),常用来转二维数组,中间有逗号隔开 parseInt(line,16) 16进制转10进制 toString()方法可以根据参数进行进制转换,如果不加参数,那么将基于十进制转换。转换的数字带有小数也可以转换 var a =625;a.toString(2) Math.cbrt数字的立方根 Math.pow(底数x,指数y) x的y次方 x**y Math.abs(x)绝对值 ~~Math.sqrt(0) 算数平方根 if (n & 1) 当n是偶数时候,二进制的末尾一定是0,那么&1的结果一定是false 当n是奇数时候,二进制末位一定是1,那么结果一定是true 截取指定的数组或字符串,返回新的字符串或数组,相当于浅拷贝了一份,所以基础类型下 新旧值是不影响的 slice(-2,-1)表示抽取了原数组中的倒数第二个元素到最后一个元素(不包含最后一个元素,也就是只有倒数第二个元素)。 12345 n!=(n-1)!×n。 if ((year % 4 == 0 && !(year % 100 == 0)) || year % 400 == 0) { var arr1 = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; var arr2 = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; } //时间,是当年第几天 function getDay(date) { } **“回文串”**是一个正读和反读都一样的字符串,初始化标志flag=true,比如“level”或者“noon”等等就是回文串。 ~是js里的按位取反 **~~**双波浪号可以快速取整数,移除小数点后面的小数,不会进行四舍五入 & 按位与 n & 1 当n是偶数时候,二进制的末尾一定是0,那么&1的结果一定是false map 判断当前存储空间是否被用尽,如果已用尽则删除 Map 头部的数据。 parseInt(num,8); //八进制转十进制 最后面一个数字可以在0~255范围内任意变化,因此可以提供256个IP地址。但是实际可用的IP地址数量是256-2,即254个。常见正则
算法概念
我们先不断地增加 right 指针扩大窗口 [left, right],直到窗口中的字符串符合要求(包含了 t 中的所有字符)
我们停止增加 right,转而不断增加 left 指针缩小窗口 [left, right],直到窗口中的字符串不再符合要求(不包含 T 中的所有字符了)。同时,每次增加 left,我们都要更新一轮结果
重复第 2 和第 3 步,直到 right 到达字符串 S 的尽头
*map和set常用点
数字进制转换问题
Math
判断奇偶方法
截取数组
阶乘
闰年判断
alert(‘闰年’);
} else {
alert(‘平年’);
var arr = date.split(‘-’);
var year = new Date(arr[0], 0, 0);
var mouth = new Date(arr[0], arr[1] - 1, arr[2]);
var day = parseInt((year - mouth) / 24 / 60 / 60 / 1000);
return day;矩阵乘积
[m,n]*[n,p]=m*n*p [m,p]
概念
运算符特殊作用
map.delete(map.keys().next().value)
进制转换
parseInt(num,16); //十六进制转十进制
parseInt(num).toString(8) //十进制转八进制
parseInt(num).toString(16) //十进制转十六进制
parseInt(num,2).toString(8) //二进制转八进制
parseInt(num,2).toString(16) //二进制转十六进制
parseInt(num,8).toString(2) //八进制转二进制
parseInt(num,8).toString(16) //八进制转十六进制
parseInt(num,16).toString(2) //十六进制转二进制
parseInt(num,16).toString(8) //十六进制转八进制排序
字母忽视大小排序
a>=b?1:-1就是从小到大排序
letterArr.sort((a,b)=>{
return a.toUpperCase()>=b.toUpperCase()?1:-1
})
子网掩码
zw=zw.map((val)=>val.toString(2).padStart(8,'0')).join('')
console.log(zw,/^1+0+$/.test(zw)) /保证前面是1后面是0