leetcode中常用的方法(JS)

本文探讨了JavaScript中的字符编码转换、字符串切片、拼接、替换、数组操作、位运算、正则表达式和数据处理等关键技巧,涵盖了字符串赋值、去重、排序及数据处理的最佳实践。

字符转unicode序号

let str = "a";
str.charCodeAt();	// 97
'z'.charCodeAt();	// 122

String.fromCharCode(97);	// a

取片段

let str= "abc";
str.slice(0,2) // "ab"substring()

合并拆分

let str= "abc";
str.split(""); // ["a","b","c"];
let arr = ["a","b","c"];
arr.join("");	// "abc"

替换

splice	//数组方法 改变原数组 添加 删除 修改
letnewstr = str.replace(/01/g,"10") //(全局的01变10)不改变原值

读取数据

"15 32 658 156 98"
let arr = readline().trim().split(" ").map(item=>+item); // 15 32 658 156 98]
// 读取第一行数据,split拆分,再字符串转数字

去重

let arr = [...new Set(arr)];

升序/降序(改变数据本身)

arr.sort((a,b)=>a-b) //升序
arr.sort((a,b)=>b-a) //降序

求最大值

let max = Math.max(...arr);
let max = Math.max.apply(null,arr);
let max = Math.max.call(null,...arr);

复制数组

let arr2 = arr.concat(a,b);
let arr2 = arr.slice(1);

关于字符串赋值!!!!字符串的replace方法不改变数组本身

JS中不能直接  字符串不能 str[i] = 'x'     不能for循环 字符串length 然后赋值 
应该使用 split()转化成字符串数组后再赋值

位运算

//求数组长度的一半
halfLen = arr.length>>1; 等价于 Math.floor(arr.length/2);
Math.floor(5/2) 等价于 ~~(5/2) 等价于 (5/2)|0
// 判断奇偶
num & 1 == 0	//偶(num最后一位为0)
num & 1 == 1	//奇(num最后一位为1)
// 异或
2^2 = 0
2^2^3^3^5 = 5

map转化为二维数组

Map转化为二维数组后排序
let map = new Map([[1,2],[2,3],[3,4]]);
const resultArr = Array.from(map); 
resultArr.sort((a,b) =>b[1] - a[1]);//对value进行从大到小排序

删除字符串中的一个元素

let str = "123456789";
let arr = str.split("");
console.log(arr);
let index= arr.findIndex((item,i)=>{
    console.log(i);
    if(item === "5")return i;
});
arr.splice(index,1);
console.log("afterDel:",arr); //afterDel: ['1', '2', '3','4', '6', '7','8', '9']
str = arr.join("");
console.log(index);	// 4
console.log("finish:",str);	//finish: 12346789

// 删除指定元素
let str = "123456789123456";
let arr = str.split("5");
console.log(arr.join("")); // 1234678912346

不会改变原来数组的有:
1.concat()—连接两个或更多的数组,并返回结果。

2.every()—检测数组元素的每个元素是否都符合条件。

3.some()—检测数组元素中是否有元素符合指定条件。

4.filter()—检测数组元素,并返回符合条件所有元素的数组。

5.indexOf()—搜索数组中的元素,并返回它所在的位置。

6.join()—把数组的所有元素放入一个字符串。

7.toString() —把数组转换为字符串,并返回结果。

8.lastIndexOf()—返回一个指定的字符串值最后出现的位置,在一个字符串中的指定位置从后向前搜索。

9.map()—通过指定函数处理数组的每个元素,并返回处理后的数组。

10.slice()—选取数组的的一部分,并返回一个新数组。

11.valueOf()—返回数组对象的原始值。

会改变原来数组的有:
1.pop()—删除数组的最后一个元素并返回删除的元素。

2.push()—向数组的末尾添加一个或更多元素,并返回新的长度。

3.shift()—删除并返回数组的第一个元素。

4.unshift()—向数组的开头添加一个或更多元素,并返回新的长度。

5.reverse()—反转数组的元素顺序。

6.sort()—对数组的元素进行排序。

7.splice()—用于插入、删除或替换数组的元素。

正则
3.重复字符 x(任意的单个字符)
x? 匹配0个或者1个x
x+ 匹配至少一个x字符
x* 匹配任意个x字符
x{m,n}匹配至少m个,最多n个x字符,包括n
x{n} 必须匹配n个x字符
(xyz)+ 小括号括起来的部分是当做单个字符处理
4.锚字符
^ 行首匹配 必须以这个正则开头
$ 行尾匹配 必须以这个正则结尾

方括号
方括号用于查找某个范围内的字符:
[A-Z] 查找任何从大写 A 到大写 Z 的字符。

### LeetCode常用算法模板及其JavaScript实现 #### 回溯算法模板 回溯算法是一种通过构建所有可能解并逐一验证的方法。对于特定问题,此方法能有效地找到满足约束条件的所有解决方案。 ```javascript function backtracking(params) { if (terminationCondition) { // 终止条件检查 storeResult(); // 存储符合条件的结果 return; } for (let choice of choicesSet) { // 遍历当前层的选择集 processNode(choice); // 对节点进行处理 backtracking(updatedParams); // 进入下一层递归调用 backtrackChoice(choice); // 撤销上一步操作以便尝试其他可能性 } } ``` 上述伪代码展示了如何利用函数`backtracking()`来执行一次完整的回溯过程[^3]。 #### 动态规划(DP)算法模板 动态规划适用于解决具有重叠子问题特性的优化类题目。通常情况下,这类问题可以通过记忆化技术提高效率。 ```javascript // 初始化dp数组或表格 const dp = Array.from({ length: n }, () => new Array(m).fill(-Infinity)); function dynamicProgramming(i, j) { if (baseCaseCheck(i, j)) return baseValue; if (dp[i][j] !== -Infinity) return dp[i][j]; // 记忆化 let result = computeBasedOnSubproblems(i, j); dp[i][j] = result; // 更新状态转移方程后的值 return result; } dynamicProgramming(startI, startJ); ``` 这段代码片段提供了一个通用框架用于求解二维空间内的DP问题[^1]。 #### 广度优先搜索(BFS)算法模板 广度优先搜索常被用来遍历图结构中的最短路径等问题,在队列的帮助下逐层扩展相邻结点直到达到目标位置为止。 ```javascript function bfs(root) { const queue = []; queue.push([root, level]); // 将根节点加入队列,并记录其所在层数 while(queue.length > 0){ const [node, depth] = queue.shift(); visit(node); node.children.forEach(child => { queue.push([child, depth + 1]); }); } } ``` 这里给出了一种基于队列的数据结构来进行BFS的方式。 #### 深度优先搜索(DFS)算法模板 深度优先搜索是从某个顶点出发尽可能深地探索下去的一种策略;当遇到死胡同时,则会退回到最近的一个未完全访问过的分支继续前进。 ```javascript function dfs(graph, vertex, visited) { console.log('Visited:', vertex); visited[vertex] = true; graph[vertex].forEach(neighbour => { if (!visited[neighbour]) { dfs(graph, neighbour, visited); } }); } ``` 这个简单的例子说明了怎样使用栈(隐含于递归机制内)完成对整个连通分量的遍历。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值