字符串「2」字符串中的第一个唯一字符 | 刷题打卡

237 阅读2分钟

前言

3月中旬了,这周正式结束js基础的复习,下周会开始复习vue相关的知识点,刷题还是每天继续!

image.png

今日题目

给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。

示例 1:

s = "leetcode" 返回 0

s = "loveleetcode" 返回 2

题目分析

拿到题目的一瞬间,小脑瓜灵光一闪就想到了哈希算法,我觉得我一定可以写出来,所以我就开始了。。。

  1. 遍历字符串,使用map记录每个字符对应的index数组

image.png

  1. 找出index数组元素个数为1的元素

image.png

  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
};

一顿操作猛如虎,一看战绩呵呵哒,把我自己都逗笑了,哈哈哈

image.png

这个时候我就在反思了

问题是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
}

执行时间大大减少

image.png

这里补充一下map提供的遍历方法:

  • Map.prototype.keys():返回键名的遍历器。
  • Map.prototype.values():返回键值的遍历器。
  • Map.prototype.entries():返回所有成员的遍历器。
  • Map.prototype.forEach():遍历 Map 的所有成员

总结

对于原生的map方法了解的不够透彻,导致遍历的时候转成数组遍历的,浪费了很大的时间,还是要再认真学习ES6的知识点。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情