Перестановка цифр числа, которое больше или равно А

Даны числа 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

→ Ссылка