# 第一个只出现一次的字符

# 难度:简单

# 描述:

给出一个字符串,找出第一个只出现一次的字符。

# 样例:

对于 aabc, b为第一个只出现一次的字符.

对于 abaccdeff, b为第一个只出现一次的字符.

# 思路分析:

可以用对象保存字符出现的次数。

# 代码模板:

const firstUniqChar = function(str) {}
1

# 想一想再看答案

# 想一想再看答案

# 想一想再看答案

# 代码:

  1. 将值删除,用 indexOf 查找还有没有相同字符,并查找之前删过的字符
const firstUniqChar = function(str) {
	str = [...str]
	let num = str.length // 保存遍历次数
	let obj = {} // 保存被删元素
	for (let i = 0; i < num; i++) {
		let item = str.splice(0, 1)[0] // 删除第一个值
		if (str.indexOf(item) === -1 && obj[item] === undefined) {
			// 当前数组中没有 并且对象中也没有
			return item // 找到
		} else {
			obj[item] = item // 出现的字符串,用对象保存起来。
		}
	}
}
console.log('输出:', firstUniqChar('abaccdeff'), firstUniqChar('aabc'))
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  1. indexOf 的第二个参数,从当前值往后搜索,并查找之前已经查过的字符

    想起了indexOf的第二个参数,省了一步删除的操作。

const firstUniqChar = function(str) {
	str = [...str]
	let obj = {}
	for (let [index, key] of str.entries()) {
		if (str.indexOf(key, index + 1) === -1 && obj[key] === undefined) {
			// 跳过这个元素,当后面没有 并且前面也没有
			return key // 找到
		} else {
			obj[key] = key // 前面出现过 存起来
		}
	}
}
console.log('输出:', firstUniqChar('abaccdeff'), firstUniqChar('aabc'))
1
2
3
4
5
6
7
8
9
10
11
12
13
  1. 记录字符出现的次数,遍历字符串,第一个只出现一次的字符,就是要找的值。
const firstUniqChar = function(str) {
	var obj = {} // 用对象
	for (var i = 0; i < str.length; i++) {
		var code = str.charCodeAt(i)
		// 记录出现的次数
		if (obj[code] == undefined) {
			obj[code] = 1
		} else {
			obj[code]++
		}
	}
	for (var i = 0; i < str.length; i++) {
		// 遍历字符串出现的顺序(保证第一次出现重复),当出现为1时,即找到
		if (obj[str.charCodeAt(i)] == 1) {
			return str.charAt(i)
		}
	}
	return null
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

# 点个Star支持我一下~