# 第一个只出现一次的字符
# 难度:简单
# 描述:
给出一个字符串,找出第一个只出现一次的字符。
# 样例:
对于 aabc
, b
为第一个只出现一次的字符.
对于 abaccdeff
, b
为第一个只出现一次的字符.
# 思路分析:
可以用对象保存字符出现的次数。
# 代码模板:
const firstUniqChar = function(str) {};
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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
2
3
4
5
6
7
8
9
10
11
12
13
- 记录字符出现的次数,遍历字符串,第一个只出现一次的字符,就是要找的值。
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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19