【问题标题】:Counting unique duplicates gone wrong计算唯一重复错误
【发布时间】:2021-02-16 09:04:51
【问题描述】:

我遇到了这个挑战,您必须计算提供的字符串中有多少重复项。

我想出了这段代码,如果有重复的字符串拼接它们并将它们计为+1,那么它应该对字符串进行排序。如果这封信不是重复的 -> 只需将它们拼接起来,我就可以继续前进。

代码是怎么回事?我不想要挑战的答案,而是要了解我哪里出错了。为什么只有4个以上同一个字母的代码才注册重复?

这里是代码,注意我只是使用var e来查看数组的哪一部分被拼接了。

预期输出:

[[p, p], [a, a, a, a], [c, c, c, c, c, c, c, c], [d, d, d, d], [g, g, g], [e, e]]

如果同一字符切片出现 2 次以上,则该重复块将被取出并将它们放入一个新数组中。

function duplicateCount(text) {
  const str = Array.from(text.toLowerCase()).sort();
  var h = 0;
  var e = [];
  for (let i = 0; i < str.length; i++) {
    if (str.lastIndexOf(str[i]) > 2) {
      h++;
      e.push(str.splice(0, str.lastIndexOf(str[i]) + 1));
      i = 0;
    } else {
      str.splice(0, 1);
      i = 0
    }
  }
  return e
}
console.log(duplicateCount('ppaaaaccccccccgggiyddddhee'));

【问题讨论】:

  • 你说它必须大于 2

标签: javascript count duplicates


【解决方案1】:

您的代码在删除匹配项时将索引设置回零。问题在于循环中的下一次迭代使它从索引 1 开始,而不是 0。所以你需要将它设置为 -1。实际上,使用 while 循环会更好。

下一个问题是您说下一个索引必须> 2。问题是pp 的索引是什么?这不是两个。你要确保索引不是同一个元素。

function duplicateCount(text) {
  const str = Array.from(text.toLowerCase()).sort();
  var h = 0;
  var e = [];
  for (let i = 0; i < str.length; i++) {
    if (str.lastIndexOf(str[i]) != i) {
      h++;
      e.push(str.splice(0, str.lastIndexOf(str[i]) + 1));
      i = -1;
    } else {
      str.splice(0, 1);
      i = -1
    }
  }
  return e
}
console.log(duplicateCount('ppaaaaccccccccgggiyddddhee'));

带有一个while循环

function duplicateCount(text) {
  const str = Array.from(text.toLowerCase()).sort();
  var h = 0;
  var e = [];
  while (str.length) {
    var lastIndex = str.lastIndexOf(str[0])
    var removed = str.splice(0, lastIndex + 1);
    if (lastIndex) {
      h++;
      e.push(removed);
    }
  }
  return e
}
console.log(duplicateCount('ppaaaaccccccccgggiyddddhee'));

【讨论】:

    【解决方案2】:

    我认为使用正则表达式和map() 可以更好地分离出我们正则表达式匹配的每个字符串。然后我们得到了一个字符串数组,正如你所问的那样。

    (.) - 第一个捕获组 - 匹配任何字符

    \1 - 匹配与第一个捕获组相同的文本

    + - 匹配 1 次到无限次

    const testString = "ppaaaaccccccccgggiyddddheep";
    
    function getAllDuplicates(str) {
      return str.split("") // split by character
        .sort() // sort the array
        .join("") // join back into sorted string
        .match(/(.)\1+/g) // match repeated characters
        .map(string => string.split("")); // use map to split each string in arr to get arr of strings
    }
    
    function getConsecutiveRepeating(str) {
      return str.match(/(.)\1+/g) // match repeated characters
        .map(string => string.split("")); // use map to split each string in arr to get arr of strings
    }
    
    console.log(getAllDuplicates(testString));
    console.log(getConsecutiveRepeating(testString));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-06
      相关资源
      最近更新 更多