Автор оригинала: FreeCodeCamp Community Member.
Прашант Ядав
В этом руководстве мы реализуем алгоритм, чтобы сформировать наименьшее возможное количество с ES6 Отказ
Input: 55010 7652634
Output: 10055 2345667
Примечание : Преобразованное число не должно начинаться с 0, если он имеет хотя бы один ненулевой символ.
Мы собираемся использовать два разных подхода к решению этой проблемы. Все будет написано в ES6 Отказ
- В первом подходе мы предположим, что предоставленное число находится в формате строки и решить его, используя сортировку, которая примет O (NLOGN).
- Во втором подходе мы будем решать с числовым значением с O (D) временем, где d – количество цифр.
Используя сортировку o (nlogn).
Реализация
- Мы преобразуем номер на массив символов, а затем отсортировать этот массив.
- После сортировки мы проверим, будет ли первый символ в массиве 0.
- Если это не 0, то мы присоединимся к массиву и вернем его.
- Если это 0, то мы найду первый ненулевой номер и поменяйте его 0 и верните его.
function smallestPossibleNumber(num){//Create a character array and sort it in ascending orderlet sorted = num.split('').sort();//Check if first character is not 0 then join and return it if(sorted[0] != '0'){ return sorted.join('');}//find the index of the first non - zero character let index = 0; for(let i = 0; i < sorted.length; i++){ if(sorted[i] > "0"){ index = i; break; } }//Swap the indexes let temp = sorted[0]; sorted[0] = sorted[index]; sorted[index] = temp;
//return the string after joining the characters of array return sorted.join(''); }Запуск программы
Input:console.log(smallestPossibleNumber('55010'));console.log(smallestPossibleNumber('7652634'));console.log(smallestPossibleNumber('000001'));console.log(smallestPossibleNumber('000000'));Output:100552345667100000000000
/*How it works let sorted = num.split('').sort(); = ['5','5','0','1','0'].sort() = ['0','0','1','5','5'] if(sorted[0] != '0'){ // '0' != '0' condition fails return sorted.join(''); } //Find the index of the first non - zero character let index = 0; for(let i = 0; i < sorted.length; i++){ if(sorted[i] > '0'){ // '1' > '0' index = i; // index = 2; break; // break; } } //swap the index var temp = sorted[0]; sorted[0] = sorted[index]; sorted[index] = temp; //return the string return sorted.join('');*/Как это работает
Сначала мы создали массив символов, таких как ['5', '5', '0', '1', 0] . Тогда мы разбираем это на [«0», «0», «1», «5», «5»] После этого мы находим первый ненулевой элемент и поменяйте его с первыми нулевыми элементами, такими как ['1', '0', '0', '5', '5'] . Теперь у нас наш самый маленький номер готов, нам просто нужно объединить их и вернуть его.
Узнайте больше о Сплит () , Сортировать () , Присоединяйтесь () Отказ
Сложность времени: o (nlogn). Космическая сложность: O (n).
Объяснение сложности времени и космического пространства
Мы создаем массив символов, который примет o (n) время. Затем сортировка массива примет o (nlogn).
После этого мы находим индекс наименьшего не нулевого номера, который может принимать O (n) в худшем случае и присоединиться к массиву для создания строки, примет o (n). Поскольку эти все операции работают один за другим. Так сложность времени является O (N + NLOGN + N + (NLOGN).
Мы создаем массив символов из строки, поэтому космическая сложность является O (n).
Используя числовое значение o (logn).
В этом подходе есть недостаток: если номер содержит только Zeros, то он вернет один нуль.
Реализация
- Мы создадим массив номеров от 0 до 9.
- Затем мы будем следить за цифрами, присутствующими в номере, увеличив их количество в массиве.
- После этого мы найду самую маленькую ненулевую цифру и уменьшите его счет на 1.
- В конце концов, мы будем воссоздать номер, организовав их в порядке возрастания и вернуть результат.
- Это решение основано на подсчете.
function smallestPossibleNumber(num) { // initialize frequency of each digit to Zero let freq = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; // count frequency of each digit in the number while (num > 0){ let d = parseInt(num % 10); // extract last digit freq[d]++; // increment counting num = parseInt(num / 10); //remove last digit }// Set the LEFTMOST digit to minimum expect 0 let result = 0; for (let i = 1 ; i <= 9 ; i++) { if (freq[i] != 0) { result = i; freq[i]--; break; } } // arrange all remaining digits // in ascending order for (let i = 0 ; i <= 9 ; i++) { while (freq[i]-- != 0){ result = result * 10 + i; } } return result; }Запуск программы
Input:console.log(smallestPossibleNumber('55010'));console.log(smallestPossibleNumber('7652634'));console.log(smallestPossibleNumber('000001'));console.log(smallestPossibleNumber('000000'));Output:10055234566710
/* How it works // initialize frequency of each digit to Zero let freq = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]; // count frequency of each digit in the number while (num > 0){ let d = parseInt(num % 10); // extract last digit freq[d]++; // increment counting num = parseInt(num / 10); //remove last digit } //After incrementing count //freq = [2, 1, 0, 0, 0, 2, 0, 0, 0, 0] // Set the LEFTMOST digit to minimum expect 0 let result = 0; for (let i = 1 ; i <= 9 ; i++) { if (freq[i] != 0) { result = i; freq[i]--; break; } } // result = 1 // arrange all remaining digits // in ascending order for (let i = 0 ; i <= 9 ; i++) { while (freq[i]-- != 0){ result = result * 10 + i; } }//10 //100 //1005 //10055 //10055 return result*/
Сложность времени: o (nlogn). Космическая сложность: O (1).
Объяснение сложности времени и космического пространства
Мы снимаем каждую цифру из числа и увеличивая соответствующий счет в массиве, который примет O (logn). Затем мы находим наименьшее ненулевое число из массива в O (10).
После этого мы переставляем цифры для создания наименьшего числа в O (10 * logn). Сложность времени o (logn + 10+ (logn) или o (d), где d нет цифр
Мы используем постоянное пространство (массив 10 номеров), поэтому космическая сложность является O (1).
Если вам понравилась эта статья, пожалуйста, дайте ей? И поделитесь этим! Если у вас есть какие-либо вопросы, связанные с этим, не стесняйтесь спрашивать меня.
Для большего количества таких и алгоритмических решений в JavaScript следуйте за мной на Twitter Отказ Я пишу о ES6 , Реагировать, nodejs, Структуры данных и Алгоритмы на Nearnersbucket.com Отказ
Оригинал: “https://www.freecodecamp.org/news/forming-the-smallest-possible-number-from-the-given-number-in-javascript-bda790655c8e/”