足够的算法来交换元素以满足特定条件

时间:2019-11-22 02:42:20

标签: algorithm

给您两个正数N和K,找到从N交换任意两个数以生成两个新数A和B的最小数,并且差(A-B)等于K(如果有不止一个)解决方案,请使用具有最大A的解决方案。

例如

我们有N = 9834216和K = 8826,我们将16交换为新的数字9168342,A = 9168和B = 342,以及A-B = 9168-342 = 8826。

1 个答案:

答案 0 :(得分:0)

let N = 9834216, K = 8826;
let count = 0;

function fn(nArr, k, n) {
  if (n == 0) {
    let temp = -k;
    if (temp <= 0) {
      return;
    }
    let tArr = [...nArr];
    while (temp > 0) {
      let temp1 = temp % 10;
      let tId = tArr.indexOf(temp1);
      if (tId < 0) {
        return;
      }
      tArr.splice(tId, 1);
      temp = Math.floor(temp / 10);
    }
    if (tArr.length == 0) {
      console.log((K - k) + "-" + (-k) + "=" + K);
      count++;
    }
  } else {
    for (let i in nArr) {
      let tArr = [...nArr];
      tArr.splice(i, 1);
      fn(tArr, k - Math.pow(10, n - 1) * nArr[i], n - 1);
    }
  }
}

function getAB(N, K) {
  let nArr = [],
    n = N;
  while (n > 0) {
    nArr.push(n % 10);
    n = Math.floor(n / 10);
  }
  nArr.sort();
  nArr.reverse();
  for (let i = nArr.length; i > nArr.length / 2; i--) {
    fn(nArr, K, i);
  }
}

getAB(N, K);
console.log(count + " solutions");