检查重复数字的编号

时间:2017-02-28 09:13:56

标签: javascript

如何检查某个数字是否有重复的数字(在其中的任何位置)?

给出的数字如下:

1, 10, 11, 1010, 1981

输出应该告诉他们哪个有重复的数字:

false, false, true, true, true

公布了jsperf page

中给出的所有好答案

6 个答案:

答案 0 :(得分:3)

我认为最快的方法是进行RegExp测试。您可以使用它来快速判断是否存在重复,并且它足够紧凑以便在条件运算符中使用。这是一个使用数字和数字字符串的示例。



function hasRepeatingdigits(N) {
  return (/([0-9]).*?\1/).test(N)
}  

console.log(
[1, 10, 11, 1010, 1981, 12345678901, 123456789].map(hasRepeatingdigits)
)




(编辑-Isaac B)

以下是RegExp工作原理的细分:

  • [0-9]创建一个0到9之间的单个字符列表 匹配。
  • 添加括号([0-9])将此列表定义为 第一个捕获组。如果您只搜索char并且不需要RegExp来执行后续操作,则不需要这些parens。 (即/ [0-9] /是你需要在字符串中找到char 0到9的第一个索引,或者在RegExp测试中找到true)
  • .匹配任何单个字符 - 除了行终止符。添加延迟量词*?匹配0到无穷大时间,尽可能少的时间。
  • \1匹配与第一个捕获组
  • 最近匹配的文本相同的文本

总结:/([0-9]).*?\1/是一个正则表达式,它遍历一个字符串,查找每个字符串0到9,并在第一次找到匹配时返回匹配当前第一个捕获组中的字符。

在字符串'123432'中,此RexExp将在捕获组1上返回完整匹配:'2343''2'

RegExp.prototype.test()使用提供的RegExp搜索字符串,如果RegExp返回匹配则返回true,否则返回false。这可以很容易地修改,以便使用/([A-Za-z]).*?\1/).test(N)找到重复的字母字符。

除了RegExp上非常有用的MDN部分之外,我强烈建议那些努力让他们更熟悉的人查看这个RegularExpressions101工具。

答案 1 :(得分:2)



{{1}}




答案 2 :(得分:1)

您可以使用Array#indexOfArray#lastIndexOf支票。



function check(a, _, aa) {
    return aa.indexOf(a) !== aa.lastIndexOf(a);
}

console.log([1, 10, 11, 1010, 1981].map(a => a.toString().split('').some(check)));




答案 3 :(得分:1)

使用Array.prototype.map()String.prototype.match()函数的简短解决方案:

function checkForRepeatingDigits(N) {
    return N.map(function (v) {
        return  [v, Boolean(String(v).match(/(\d)\d*?\1/g))];
    });
}

console.log(checkForRepeatingDigits([1, 10, 11, 1010, 1981]));

答案 4 :(得分:1)

这首先将数字转换为带有N = N + ''的字符串,然后检查split()的结果,这是一个String函数,它根据分隔符将字符串压缩为较小的部分。

例如,如果我将"aba"拆分为"b",我将获得一个包含["a", "a"]的数组。如您所见,如果出现"b",则返回数组的长度为2。如果还有更多,则会超过2。这就是我在我的解决方案中使用的内容。

作为奖励,它适用于其他类型的数据,甚至是nullundefined。 ;)

function check(N) {
  for (var N = N + '', i = (N).length; i--;)
    if (N.split(N[i]).length > 2)
      return true;

  return false;
}

[1, 10, 11, 1010, 1981, "abcd23", "aab", "", null, undefined].forEach(num => {
  console.log(num, check(num));
});

答案 5 :(得分:0)

    function repeated(n) {
      var digits = [];
      var digit;

      while (n) {
        digit = n % 10;
        if (digits[digit]) return true;
        digits[digit] = true;
        n = Math.floor(n / 10);     
      }

      return false;
    }

 [1, 10, 11, 1010, 1981].forEach(n => console.log(n, repeated(n)));

相关问题