如何检查数字是否在一个数字中出现了多次(任意位置)?
示例输入数字:
1, 10, 11, 1010, 1981
输出应告诉哪个数字有重复的数字:
false, false, true, true, true
如何检查数字是否在一个数字中出现了多次(任意位置)?
示例输入数字:
1, 10, 11, 1010, 1981
输出应告诉哪个数字有重复的数字:
false, false, true, true, true
我认为最快的方法是使用正则表达式测试。您可以使用它快速地得到一个关于是否存在重复的真或假,并且它足够紧凑,可以在条件运算符中使用。这里有一个适用于数字和数字字符串的示例。
function hasRepeatingdigits(N) {
return (/([0-9]).*?\1/).test(N)
}
console.log(
[1, 10, 11, 1010, 1981, 12345678901, 123456789].map(hasRepeatingdigits)
)
[0-9]
创建一个由数字0到9组成的字符列表,用于匹配。([0-9])
将此列表定义为第一个捕获组。如果您只需要搜索一个字符而不需要正则表达式执行后续操作,则不需要这些括号。(即:在字符串中查找字符0到9的第一个索引或在RegExp测试中查找true时,只需使用/[0-9]/)
• .
可以匹配除行终止符之外的任何单个字符。添加惰性量词*?
,可匹配0到无限次数,尽可能少地匹配。\1
匹配最近由第一个捕获组匹配的相同文本。/([0-9]).*?\1/
是一个正则表达式,在迭代字符串时查找每个0到9的字符,并在第一次匹配当前在第一个捕获组中的字符时返回匹配项。'123432'
中,这个RexExp会返回完整的匹配项:'2343'
,并在捕获组1:'2'
中。/([A-Za-z]).*?\1/).test(N)
查找重复字母字符。function checkForRepeatingDigits(N){
var arr = (''+N).split(''),
result = arr.filter((elem, i) => arr.indexOf(elem) == i);
return result.length != (''+N).length;
}
// Or
function checkForRepeatingDigits(N){
return [...new Set((''+N).split(''))].length != (''+N).length;
}
console.log([1, 10, 11, 1010, 1981].map(checkForRepeatingDigits))
Array#indexOf
和 Array#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)));
使用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]));
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)));
N = N + ''
,然后检查split()
的结果,它是一个基于分隔符将字符串压缩成较小部分的字符串函数。"b"
拆分"aba"
,我将得到包含["a", "a"]
的数组。如你所见,如果有一个"b"
出现,则返回的数组长度为2
。如果有更多,则超过2
。这就是我在解决方案中使用的方法。null
和undefined
。;)
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));
});
+=
,使其更加简短。 - dodovconst isRepeated = (num) => new Set('' + num).size != ~~Math.log10(num) + 1;
[1, 10, 11, 1010, 1981].forEach(n => console.log(n, isRepeated(n)));