为了账号安全,请及时绑定邮箱和手机立即绑定

计算错误的唯一重复项

计算错误的唯一重复项

素胚勾勒不出你 2023-07-06 10:20:41
我遇到了这个挑战,您必须计算提供的字符串中有多少个重复项。我想出了这段代码,如果有重复的字符串,应该对字符串进行排序,拼接它们并将它们计为总数+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 回答

?
富国沪深

TA贡献1790条经验 获得超9个赞

当您的代码删除匹配项时,会将索引设置回零。问题是循环中的下一次迭代使其从索引 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'));


查看完整回答
反对 回复 2023-07-06
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

认为使用正则表达式可以更好地做到这一点,并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));


查看完整回答
反对 回复 2023-07-06
  • 2 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信