Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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.
Ответить с цитированием
  #2 (permalink)  
Старый 06.04.2021, 20:26
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Сообщение от vlad_kl
что есть быстрее цикла в JS?
ничего.
Сообщение от vlad_kl
Какие есть ещё варианты решения подобных задач с перебором,
откажитесь от перебора - вычислите результат одной строкой
Ответить с цитированием
  #3 (permalink)  
Старый 06.04.2021, 20:33
Интересующийся
Отправить личное сообщение для vlad_kl Посмотреть профиль Найти все сообщения от vlad_kl
 
Регистрация: 16.06.2020
Сообщений: 22

Сообщение от рони Посмотреть сообщение
откажитесь от перебора - вычислите результат одной строкой
А можно поконкретней, что вы имели в виду?
Ответить с цитированием
  #4 (permalink)  
Старый 06.04.2021, 20:50
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

vlad_kl,
наверняка есть формула по которой можно рассчитать а не перебирать.
Ответить с цитированием
  #5 (permalink)  
Старый 06.04.2021, 21:11
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

vlad_kl,
условно для чисел 10, 100, и т.д.
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;

}
function test(n) {
   let {length} = n.toString();
   return --length * Math.pow(10, --length)
}

console.log(number9(100000), test(100000))
Ответить с цитированием
  #6 (permalink)  
Старый 06.04.2021, 22:04
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Вообще задачи с codewars стоит самому решать.
Тем вы и учитесь
Данная задача решается без строковых функций
Делением на 10 и остаток 9 (a%10 ===9)
рони,
присоединяйся https://www.codewars.com там есть чем потренировать свои знания
Ответить с цитированием
  #7 (permalink)  
Старый 06.04.2021, 22:43
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,072

Vlasenko Fedor,
Ответить с цитированием
  #8 (permalink)  
Старый 07.04.2021, 11:12
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

function number9(n) {
  var count = 0;
  var p10count = 0;
  var p10 = 1;
  var m = n, prev = 0;
  while (m > 0) {
    var dig = m % 10;
    count = count + (dig === 9 ? prev + 1 : 0) + dig * p10count;
    m = Math.floor(m / 10);
    prev = prev + dig * p10;
    p10count = p10count * 10 + p10;
    p10 = p10 * 10;
  }
  return count;
}

alert('1234: ' + number9(1234));
Ответить с цитированием
  #9 (permalink)  
Старый 07.04.2021, 11:55
Аватар для Vlasenko Fedor
Профессор
Отправить личное сообщение для Vlasenko Fedor Посмотреть профиль Найти все сообщения от Vlasenko Fedor
 
Регистрация: 13.03.2013
Сообщений: 1,572

Alexandroppolus,
да код проходит тесты
https://www.codewars.com/kata/551431...ain/javascript
но это вы сделали, а не vlad_kl,
там есть много интересных задач
Ответить с цитированием
  #10 (permalink)  
Старый 07.04.2021, 12:04
Аватар для Alexandroppolus
Профессор
Отправить личное сообщение для Alexandroppolus Посмотреть профиль Найти все сообщения от Alexandroppolus
 
Регистрация: 25.10.2016
Сообщений: 1,005

Сообщение от Vlasenko Fedor
но это вы сделали, а не vlad_kl
да и хрен с ним, задача-то на 5kyu всего, на хлеб не намажешь.
4 и более сам решать будет )

Сообщение от Vlasenko Fedor
там есть много интересных задач
знаю, знаю..
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужен элементарный код расчета и подстановки значений domumosta Events/DOM/Window 5 07.01.2016 17:18
Нужен код кальтулятора по расцету стоимости натяжных потолков denis37ivanovo Работа 2 09.01.2014 14:57
Какой код нужен для строки (фото) Alfinavi Элементы интерфейса 1 02.08.2012 01:57
Заменить определенные конструкции на странице. Нужен оптимизированный вариант. webpuper Events/DOM/Window 8 03.09.2011 23:12
Нужен простой код krovkop Общие вопросы Javascript 1 15.08.2010 17:53