首页 > 解决方案 > 循环通过拆分数字javascript

问题描述

我有这个函数,我想遍历两个字符串并接收最接近它的 compareNumber 的返回值 - 即 (compareNumber +1) 但前提是它的数字都不等于任何 searchNumber 的数字。如果 compareNumber 的任何数字等于 searchNumber 的任何数字,我需要找到大于 compareNumber 的第一个值,它不等于 searchNumber 的任何数字。

function compareNumbers(searchNumber, compareNumber){ 
  var isEqual = true;
  var digitsCompare = compareNumber.toString().split('');
  searchNumber.toString().split('').forEach(function(num,index) {
    if(!(num===digitsCompare[index])){
      isEqual = false;
    } 
  });
  return isEqual; 
} 

var b = compareNumbers(123,124);
console.log(b);
var d = compareNumbers(123,123); 
console.log(d);

标签: javascriptarraysloops

解决方案


我认为最好从数学上考虑这一点,而不是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);

很多杂乱无章/丑陋的东西是为了解决极端情况。

第一个极端情况是,如果我们增加 a 9,那么它不应该变成 a 10,而是我们可用的最小数字重复两次

但是,其中有一个极端情况。如果我们可用的最小数字是0,并且9是我们的第一个数字,我们不能用 替换它00。否则,您最终可能会915成为0015.


推荐阅读