[ CodeWar ] - 001:过滤重复字符

509 阅读2分钟

系列文章

题目

闲话少说,先看题目:

img-01

大致意思就是忽略大小写,判断字符串中是否存在重复的字符,如果存在则返回 false,否则返回 true

解析

题目很简单,直接开整。

首先用最笨的思路一步步来:

  • 设置一个 count = 0,一个 emptyArr = []
  • 将字符串转小写(或大写)
  • 遍历字符串,判断字符是否存在 emptyArr 中,如果存在则 count ++
  • 如果最后 count === 0,则返回 true,否则返回 false

照着上面的思路将代码敲出来即可:

function isIsogram(str) {
  let count = 0,
    emptyArr = [];
  for (const c of str) {
    if (emptyArr.includes(c)) {
      count++;
    }
    emptyArr.push(c);
  }
  return count === 0;
}

优化

看着上面的代码,想必你一定一脸便秘的表情。

meme-01

这么简单的功能,写成这样???

别急,慢慢来嘛,让我们再来分析分析题目。显然,其核心是:

  • 判断字符串中是否存在重复的字符

既然和重复有关,那就好说了,我们都知道,ES6 中的 Set 可以去除数组(类数组)中的重复元素。那么我们可以按照如下思路来实现需求:

  • str 转小写(或大写)后转化成一个 Set
  • 判断 Set.size 是否等于 str.length
  • 如果最后 Set.size === str.length,则返回 true,否则返回 false

那么我们照着思路将代码敲出来看看:

function isIsogram(str) {
  const set = new Set(str.toLowerCase());
  return set.size === str.length;
}

现在看起来舒服些了吧。

meme-02

其他思路

对于这样一个小小的功能,上面的代码已经差不多了,这里我们看看大佬们其他思路的代码:

function isIsogram(str){ 
  return !/(\w).*\1/i.test(str)
}

显然,判断字符的操作,正则是非常不错的选择。