前言
3月中旬了,这周正式结束js基础的复习,下周会开始复习vue相关的知识点,刷题还是每天继续!
今日题目
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
示例 1:
s = "leetcode" 返回 0
s = "loveleetcode" 返回 2
题目分析
拿到题目的一瞬间,小脑瓜灵光一闪就想到了哈希算法,我觉得我一定可以写出来,所以我就开始了。。。
- 遍历字符串,使用map记录每个字符对应的index数组
- 找出index数组元素个数为1的元素
- 输出数组中存放的index值, 8 就是我们要找的结果
var firstUniqChar = function(s) {
const map = new Map()
for(let i in s) {
if (!map.has(s.charAt(i))) {
map.set(s.charAt(i), [i])
} else {
map.get(s.charAt(i)).push(i)
}
}
const item = [...map].find(item => {
return item[1].length === 1
})
return item && item[1] ? item[1][0] : -1
};
一顿操作猛如虎,一看战绩呵呵哒,把我自己都逗笑了,哈哈哈
这个时候我就在反思了
问题是map中不需要存储重复的字符,但是怎么表示已经重复的字符呢? 答案是只要把重复的字符对应的值设置成-1即可, 优化后的代码如下:
var firstUniqChar = function(s) {
const map = new Map()
for (let i = 0; i < s.length; i++) {
if (map.has(s.charAt(i))) {
map.set(s.charAt(i), -1)
} else {
map.set(s.charAt(i), i)
}
}
let index = -1
map.forEach(item => {
if (item !== -1) {
if (index === -1) { // 只进行第一次下标不为-1的赋值
index = item
return
}
}
})
return index
}
执行时间大大减少
这里补充一下map提供的遍历方法:
- Map.prototype.keys():返回键名的遍历器。
- Map.prototype.values():返回键值的遍历器。
- Map.prototype.entries():返回所有成员的遍历器。
- Map.prototype.forEach():遍历 Map 的所有成员
总结
对于原生的map方法了解的不够透彻,导致遍历的时候转成数组遍历的,浪费了很大的时间,还是要再认真学习ES6的知识点。
本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情