刷算法常见注意点

num

正无穷:Infinity

金额格式化:利用字符串提供的toLocaleString()方法处理。有时候不生效,比如app

数字容错:if(!Number.isFinite(num)){ //不是数字}

js数组

头部添加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()、apply()、bind()

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<<n 2的n次方 a**b a的b次方

常见正则

/s空白字符

+1或多个

算法概念

DFS:深度优先搜索算法,就是一条路走到黑的算法,走不通了就往回走(一种一种的尝试,在把所有可能情况尝试)

解决的问题

如果只是要找到某一个结果是否存在,那么DFS会更高效。因为DFS会首先把一种可能的情况尝试到底,才会回溯去尝试下一种情况,只要找到一种情况,就可以返回了。但是BFS必须所有可能的情况同时尝试,在找到一种满足条件的结果的同时,也尝试了很多不必要的路径

BFS:宽度优先搜索算法(又称广度优先搜索)是最简便的图的搜索算法之一

系统地展开并检查图中的所有节点,以找寻结果。换句话说,它并不考虑结果的可能位置,彻底地搜索整张图,直到找到结果为止.空间复杂度为o(2^n)

回溯算法

回溯是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法

中序遍历

中序遍历首先遍历左子树,然后访问根结点,最后遍历右子树。若二叉树为空则结束返回

匈牙利算法Hungarian algorithm)。

匈牙利算法主要用于解决一些与二分图匹配有关的问题。

二分图Bipartite graph)是一类特殊的,它可以被划分为两个部分,每个部分内的点互不相连。

使用场景:求二分图的最大匹配数最小点覆盖数

滑动窗口

我们在字符串 S 中使用双指针中的左右指针技巧,初始化 left = right = 0,把索引闭区间 [left, right] 称为一个「窗口」。
我们先不断地增加 right 指针扩大窗口 [left, right],直到窗口中的字符串符合要求(包含了 t 中的所有字符)
我们停止增加 right,转而不断增加 left 指针缩小窗口 [left, right],直到窗口中的字符串不再符合要求(不包含 T 中的所有字符了)。同时,每次增加 left,我们都要更新一轮结果
重复第 2 和第 3 步,直到 right 到达字符串 S 的尽头

  • 增加窗口右边界,寻找一个可行解,在找到可行解的情况下增加窗口左边界,优化可行解,找到最优解

二维数组创建坑

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和set常用点

数组转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

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) {
alert(‘闰年’);

​ var arr1 = [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];
} else {
​ alert(‘平年’);

​ var arr2 = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31];

}

//时间,是当年第几天

function getDay(date) {
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]
概念

**“回文串”**是一个正读和反读都一样的字符串,初始化标志flag=true,比如“level”或者“noon”等等就是回文串

运算符特殊作用

~是js里的按位取反

**~~**双波浪号可以快速取整数,移除小数点后面的小数,不会进行四舍五入

& 按位与

n & 1 当n是偶数时候,二进制的末尾一定是0,那么&1的结果一定是false

map

判断当前存储空间是否被用尽,如果已用尽则删除 Map 头部的数据。
map.delete(map.keys().next().value)

进制转换

parseInt(num,8); //八进制转十进制
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
})
子网掩码

最后面一个数字可以在0~255范围内任意变化,因此可以提供256个IP地址。但是实际可用的IP地址数量是256-2,即254个。

zw=zw.map((val)=>val.toString(2).padStart(8,'0')).join('')
console.log(zw,/^1+0+$/.test(zw))  /保证前面是1后面是0
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值