Я думаю, что было бы лучше рассмотреть это математически, в отличие от простого добавления 1
навсегда, пока вы не найдете число, которое работает.
Решение ниже перебирает каждую отдельную цифру, увеличивая ее на 1
, пока мы не найдем цифру, которую нам разрешено использовать. Как только мы внесем это изменение, мы знаем, что остальные цифры будут заменены наименьшее доступное нам число.
Думайте об этом как о кодовом замке, за исключением того, что как только вы поворачиваете один диск, все после него сбрасываются до самого низкого номера, который мы можем использовать.
function compareNumbers(n1, n2) {
var n1Array = ("" + n1).split("").map(Number);
var n2Array = ("" + n2).split("").map(Number);
var availableNumbers = [...Array(10).keys()].filter(n => !n1Array.includes(n));
//Loop through each digit in our compare string
n2Array.some((n, index) => {
let originalN = n;
//Increment it until we have a valid number
while (!availableNumbers.includes(n))
if (n < 9) n++
else {
//If we've passed 9, then we need to use the lowest number *twice*
//However, if we're changing the first number, we CAN'T replace it with a 0
n = Number((index === 0 ? availableNumbers[0] || availableNumbers[1] : availableNumbers[0]).toString() + availableNumbers[0]);
break;
}
if (originalN !== n) {
n2Array[index] = n;
var replacements = n2Array.splice(index + 1).map(n => availableNumbers[0]);
n2Array = [...n2Array, ...replacements];
return true; //Exit early
}
return false; //Keep iterating
});
//Turn [4,0,0] into 400
return Number(n2Array.join(""));
}
let result1 = compareNumbers(123,124);
console.log(result1);
let result2 = compareNumbers(123,423);
console.log(result2);
Большая часть беспорядочных / уродливых вещей - это учет крайних случаев.
Первый крайний случай заключается в том, что если мы увеличим 9
, то он не должен стать 10
, а наименьшим доступным нам числом , повторенным дважды .
Тем не менее, в этом есть крайний регистр . Если наш самый низкий доступный номер - 0
, а 9
- наш первый номер, мы не можем заменить его на 00
. В противном случае вы можете получить 915
, став 0015
.