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

# 难度:简单

# 描述:

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

# 样例:

对于 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支持我一下~

最后更新时间: 8/2/2019, 12:38:18 PM