简易描述
给定一个字符串,找到它的第一个不重复的字符,并返回它的索引。如果不存在,则返回 -1。
解题思路
看起来是一道简单题,但是实际上的玩法还是比较多的。
必然需要两次遍历才能解决这个问题,一次可以构建一个map,然后再遍历一次数组,如果存在值为1 那么就是这个了。
或者使用一个数组来代替map,字符是有对应的ascll值的,使用一个数组存起来,然后再遍历数组进行确认,这个要比map快一点。
还可以使用队列+map,发现了重复的,就对队列的第一个数据进行改变。
代码实现
// 简单解法就直接map的,但是我们可以采取更加简单的做法 比如直接通过char数组来进行判断// charCodeAt a的ascll码为97// 进行两次遍历是必然的function firstUniqChar1(str: string): number {const list: number[] = Array(26).fill(0)for (let i = 0; i < str.length; i++) {list[str.charCodeAt(i) - 97] += 1}// 再进行一次遍历for (let i = 0; i < str.length; i++) {if (list[str.charCodeAt(i) - 97] === 1) {return i}}return -1};// 也可以使用队列function firstUniqChar(str: string): number {const map: {[k: string]: number} = {}const list: [string, number][] = []for (let i = 0; i < str.length; i++) {if (!map[str[i]]) {map[str[i]] = 1list.push([str[i], i])} else {map[str[i]] = -1while (list.length && map[list[0][0]] === -1) {list.shift()}}}return list.length ? list[0][1] : -1};
