LeetCode Algorithm Tips
使用一个字符的ASCII码值来统计字母在字符串中出现的次数
- ASCII码值:每个字符都有一个对应的ASCII码值,例如字母
a
的ASCII码值是97,字母b
的ASCII码值是98,以此类推。
- 计算差值:为了得到一个字符对应的索引,我们可以用该字符的ASCII码值减去字母
a
的ASCII码值。这样,字母a
会得到索引0,字母b
会得到索引1,字母c
会得到索引2,以此类推。
创建一个长度为26的数组来表示英文字母的频率,初始化每个位置为0。因为英文小写字母共有26个,所以数组长度为26。
// Step 1: 统计频率 let freq = new Array(26).fill(0);
使用一个循环遍历字符串s
中的每个字符,计算字符的ASCII码值与字母a
的ASCII码值之差,该差值就是该字符在freq
数组中的索引位置,然后将对应的频率加1。
for (let char of s) { freq[char.charCodeAt(0) - 'a'.charCodeAt(0)]++; }
使用filter
函数过滤掉那些频率为0的字符,因为这些字符在字符串s
中没有出现。然后使用sort
函数对频率数组进行降序排序。
freq = freq.filter(f => f !== 0).sort((a, b) => b - a);
slice()的技巧
slice()
方法的主要用途是从已有的数组中返回选定的元素。它会返回一个新的数组对象,这个新数组对象将包含原始数组中被选定的元素的浅拷贝。
slice()
可以接收两个参数:开始和结束位置,来指定要提取的元素范围。如果不提供任何参数,它将返回原始数组的一个完整的浅拷贝。
一些使用 slice()
的例子:
- 基础用法:提取数组的一部分:
javascriptCopy code let numbers = [1, 2, 3, 4, 5]; let subset = numbers.slice(1, 4); // [2, 3, 4]
- tip:使用
slice()
进行数组的浅拷贝:
javascriptCopy code let original = [1, 2, 3]; let copied = original.slice(); // [1, 2, 3]
- tip:用于将类数组对象/集合转换为新数组:
javascriptCopy code let nodeList = document.querySelectorAll('div'); let arrayOfDivs = Array.prototype.slice.call(nodeList);