Qayta raqamlar uchun raqamni tekshiring

Muayyan sonning takrorlanadigan raqamlari mavjudligini tekshirish (har qanday joyda)?

Quyidagi kabi raqamlar:

1, 10, 11, 1010, 1981

Chiqib ketishning qaysi birida takrorlangan raqamlarga ega bo'lishi kerak:

false, false, true, true, true

Publihsed all the good answers given in a jsperf page

2

6 javoblar

Menimcha, eng tezkor usul RegExp testi bo'ladi. Uni takror-takror tekshirish uchun tezda to'g'ri yoki noto'g'ri xulosa chiqarish uchun foydalanishingiz mumkin, va shartli operatorlarda foydalanish uchun juda kichik. Raqamlar va raqamlar bilan ishlaydigan misol.

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

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

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

(Tahrirlash - Isaak B)

RegExp ning qanday ishlashi bu erda:

  • The [0-9] creates a list of single characters between 0 and 9 to be matched.
  • Adding the parentheses ([0-9]) defines this list as the first capture group. These parens would not be needed if you were only searching for a char and didn't need the RegExp to perform a subsequent action. (i.e. /[0-9]/ is all you need to find the first index of a char 0 through 9 in a string, or true in a RegExp test)
  • The . matches any single char - except for line terminators. Adding the lazy quantifier *? matches between 0 and infinity times, as few time as possible.
  • The \1 matches the same text as most recently matched by the first capture group

Xulosa: /([0-9]). *? \ 1/ 0 dan 9 gacha bo'lgan har bir chiziqni topib, o'yinni birinchi marta qaytarish uchun qaytib keladigan oddiy ibora hozirgi kunda qo'lga kiritgan guruhda xarakteri topilgan.

'123432' satrida, bu RexExp ta'qib qilish guruhi 1da: '2343' to'liq mos keladigan qaytadi: '2' .

RegExp.prototype.test (), berilgan RegExp foydalanib, mag'lubiyatga izlaydi va RegExp bir o'yinni qaytarib beradi, aks holda bu noto'g'ri qaytadi. Bu /([A-Za-z]). *? \ 1 /) testidan foydalanib, ikki nusxadagi xatni topish uchun osongina o'zgartirilishi mumkin. Test (N) .

RegExp dagi juda foydali MDN bo'limidan tashqari , Men ushbu RegularExpressions101 avtomobilini tekshirish uchun ular bilan yanada qulayroq ishlashga harakat qilaman.

3
qo'shib qo'ydi
Bu, eng tezkor! rahmat! jsperf uchun savolimni tekshiring
qo'shib qo'ydi muallif vsync, manba
siz o'zingizning sehringizni qanday amalga oshirayotganini bilmaganlar uchun mehribon bo'lasizmi?
qo'shib qo'ydi muallif vsync, manba
Bu savolga javob berish uchun faqatgina bir qismini qo'shib qo'ydi.
qo'shib qo'ydi muallif Isaac B, manba

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

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))
</div> </div>
2
qo'shib qo'ydi

Array.prototype.map() va String.prototype.match() funktsiyasidan foydalanib, qisqa yechim:

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

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]));
</div> </div>
1
qo'shib qo'ydi

Array bilan chekdan foydalanishingiz mumkin. #indexOf va Array # lastIndexOf ni bosing.

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

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)));
</div> </div>
1
qo'shib qo'ydi

Bu birinchi navbatda kodni N = N + "" bilan bir qatorga o'zgartiradi va keyin split() - bu satrlarni ajratuvchi elementga asoslangan kichik qismlarga ezadigan string funksiyasi.

Misol uchun, "aba" ni "b" bilan ajratsam, ["a", "a"] . Ko'rib turganingizdek, agar "b" bir marta ro'y bersa, qaytarilgan qatorning uzunligi 2 hisoblanadi. Agar ko'proq bo'lsa, u 2 tugaydi. Bu mening halimda foydalanadigan narsadir.

Bonus sifatida boshqa ma'lumotlar turlari bilan ishlaydi, hatto null va undefined . ;)

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

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));
});
</div> </div>
1
qo'shib qo'ydi
yomon emas! Kodni qisqartirish uchun uni tahrir qilaman. Buni test sahifasiga qo'shdim (mening savolimdagi link)
qo'shib qo'ydi muallif vsync, manba
uni olib tashlashni ham qisqartirishingiz mumkin: FALSE qaytarish :)
qo'shib qo'ydi muallif vsync, manba
ha, lekin amalda real maqsadda foydalanish uchun false kodini qaytarish kerak emas
qo'shib qo'ydi muallif vsync, manba
Loopning boshlang'ich qismida + = qo'shib, uni qisqartirgan edim.
qo'shib qo'ydi muallif Hristiyan Dodov, manba
Ha, lekin bu savolda chiqishni true yoki false bo'lishi kerak.
qo'shib qo'ydi muallif Hristiyan Dodov, manba

<div class="snippet" data-lang="js" data-hide="false" data-console="true" data-babel="false"> <div class="snippet-code">

    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)));
</div> </div>
0
qo'shib qo'ydi
Javascript UZB
Javascript UZB
99 ishtirokchilar

@js_uzb @vuejs_uz @react_uz @nodejs_uz @angular_uz @ngTashkent @yiiframework_uz @laravel_uz @linux_uzbek @python_uz @swift_uzb —————— @uzdevgroup @UzGeeksGroup ——— @UzDev_Jobs @jobs_uzb