题目链接

简易描述

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

解题思路

看起来是一道简单题,但是实际上的玩法还是比较多的。
必然需要两次遍历才能解决这个问题,一次可以构建一个map,然后再遍历一次数组,如果存在值为1 那么就是这个了。
或者使用一个数组来代替map,字符是有对应的ascll值的,使用一个数组存起来,然后再遍历数组进行确认,这个要比map快一点。
还可以使用队列+map,发现了重复的,就对队列的第一个数据进行改变。

代码实现

  1. // 简单解法就直接map的,但是我们可以采取更加简单的做法 比如直接通过char数组来进行判断
  2. // charCodeAt a的ascll码为97
  3. // 进行两次遍历是必然的
  4. function firstUniqChar1(str: string): number {
  5. const list: number[] = Array(26).fill(0)
  6. for (let i = 0; i < str.length; i++) {
  7. list[str.charCodeAt(i) - 97] += 1
  8. }
  9. // 再进行一次遍历
  10. for (let i = 0; i < str.length; i++) {
  11. if (list[str.charCodeAt(i) - 97] === 1) {
  12. return i
  13. }
  14. }
  15. return -1
  16. };
  17. // 也可以使用队列
  18. function firstUniqChar(str: string): number {
  19. const map: {
  20. [k: string]: number
  21. } = {
  22. }
  23. const list: [string, number][] = []
  24. for (let i = 0; i < str.length; i++) {
  25. if (!map[str[i]]) {
  26. map[str[i]] = 1
  27. list.push([str[i], i])
  28. } else {
  29. map[str[i]] = -1
  30. while (list.length && map[list[0][0]] === -1) {
  31. list.shift()
  32. }
  33. }
  34. }
  35. return list.length ? list[0][1] : -1
  36. };