Перестановка цифр числа, которое больше или равно А
Даны числа A и B. Нужно найти из перестановок цифр числа B то наименьшее натуральное число, которое больше или равно A. Например в случае A = 3075, B = 6604 мы получим 4066. Надо написать функцию которая получит массив [A, B] и для этого массива будет возвращать нужное число. И 0 если такое число не существует.
function permute(arr) {
var i, ch;
for (i = 0; i < arr.length; i++) {
ch = arr.splice(i, 1)[0];
newArray.push(ch);
if (arr.length == 0) {
res.push(newArray.slice());
}
permute(arr);
arr.splice(i, 0, ch);
newArray.pop();
}
if (result >= someArray[0]) {
return res;
}
return 0;
}
console.log(permute[3075, 6604]); // Должен выводиться 4066
console.log(permute[3000203, 4562454]); // Должен выводиться 4244556
console.log(permute[6604, 3012]); // Должен выводиться 0
console.log(permute[101, 105]); // Должен выводиться 105
Поможете верно решить задачу?
Ответы (2 шт):
Автор решения: Denis640Kb
→ Ссылка
Можно реализовать таким образом:
function permute(arr) {
function* differ(n) {
if (n.length > 1)
for (let i = 0; i < n.length; i++)
for (let t of differ(n.slice(0, i) + n.slice(i + 1)))
yield n.charAt(i) + t;
else yield n;
}
let result = Number.MAX_VALUE;
for (let numbers of differ(String(arr[1]))){
//console.log(numbers);
if (+numbers <= result && +numbers >= +arr[0]) {
result = +numbers;
}
}
if(result == Number.MAX_VALUE){
result = 0;
}
return result;
}
console.log(permute([3075, 6604])); // Должен выводитя 4066
console.log(permute([3000203, 4562454])); // Должен выводитя 4244556
console.log(permute([6604, 3012])); // Должен выводитя 0
console.log(permute([512, 256])); // Должен выводитя 105
Автор решения: Qwertiy
→ Ссылка
function f(a, b) {
a += "", b += ""
if (a.length > b.length) {
return 0
}
var c = Array(10).fill(0)
for (var x of b) ++c[x]
function next(i) {
for (; i < 10; ++i) {
if (c[i]) {
--c[i]
return i
}
}
}
function tail() {
return c.map((n, i) => (""+i).repeat(n)).join("")
}
if (a.length < b.length) {
return +(next(1) + tail())
}
var res = ""
for (var q=0; q<a.length; ++q) {
var cur = next(a[q])
if (cur == null) {
for (var w=res.length-1; w>=0; --w) {
++c[cur = res[w]]
cur = next(++cur)
if (cur != null) {
return +(res.slice(0, w) + cur + tail())
}
}
return 0
}
res += cur
if (cur > a[q]) return +(res + tail())
}
return res
}
console.log(f(3075, 6604)) // 4066
console.log(f(3000203, 4562454)) // 4244556
console.log(f(6604, 3012)) // 0
console.log(f(101, 105)) // 105
console.log(f(1234, 1222)) // 2122