Показать сообщение отдельно
  #1 (permalink)  
Старый 06.04.2021, 20:20
Интересующийся
Отправить личное сообщение для vlad_kl Посмотреть профиль Найти все сообщения от vlad_kl
 
Регистрация: 16.06.2020
Сообщений: 22

Посчитать кол-во 9 в числах от 1 до n (нужен оптимизированный код)
Всем добрый день.
Все мы хорошо помним школьную задачку: посчитать, сколько раз встречается 9 во всех числах от 1 до 100. Ответ: 9, 19, 29, 39, 49, 59, 69, 79, 89, 90-99. Итого от 1 до 100 девятка встречается 20 раз.

Аналогичную задачку нашёл на codewars. Решить её несложно, есть много разных вариантов... НО по условиям задачи код должен выполняться быстро даже для 10 млрд. итераций. В моём случае при 5 млн. итераций - выполнение ~3 сек. Ну а за 100 млн. я уже вообще молчу, не говоря о 10 миллиардах. Ограничение codewars = 12 секунд на выполнение функции


Вариант 1
function number9(n) {
    let count = 0;
    for (let i = 1; i <= n; i++) {
        i = i.toString().split('');
        count += i.filter( el => el === '9').length;
        i = i.join('');
    }
    return count;
}



Вариант 2
function number9(n) {
    let count = 0;
    for (let i = 1; i <= n; i++) {
        if (i.toString().match(/9/g) === null) continue;
        count += i.toString().match(/9/g).length;
    }
    return count;
}


И тут, собственно, возник вопрос, а что есть быстрее цикла в JS? Какие есть ещё варианты решения подобных задач с перебором, но более оптимальных?
Или, может, просто я совсем нелепое решение придумал?

Спасибо за ваши варианты

Последний раз редактировалось vlad_kl, 06.04.2021 в 20:29.
Ответить с цитированием