цикл через разделенные числа JavaScript - PullRequest
0 голосов
/ 08 января 2019

У меня есть эта функция, я хочу перебрать обе строки и получить возвращаемое значение для 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);

Ответы [ 3 ]

0 голосов
/ 08 января 2019

код ниже:

function compareNumbers(searchNumber, compareNumber) {
  //error check the args
  var searchString = searchNumber + "";
  var compareString = compareNumber + "";

  if (compareString.length === 0) return "nope";
  var compareInt = parseInt(compareString) + 1;
  if (searchString.length === 0) {
    return compareInt;
  }

  //don't crash the app
  if (searchString.length >= 10 
    && searchString.indexOf("0") >= 0 && searchString.indexOf("1") >= 0 
    && searchString.indexOf("2") >= 0 && searchString.indexOf("3") >= 0 
    && searchString.indexOf("4") >= 0 && searchString.indexOf("5") >= 0 
    && searchString.indexOf("6") >= 0 && searchString.indexOf("7") >= 0 
    && searchString.indexOf("8") >= 0 && searchString.indexOf("9") >= 0 ) {
      return "nope";
  }

  while(containsDigits(searchString, compareInt)) {
    compareInt++;
  }

  return compareInt;
}
    
function containsDigits(digits, intVal) {
  var strVal = intVal + "";
  var strDigits = digits + "";
  for(var i = 0; i < strDigits.length; i++) {
    if (strVal.indexOf(strDigits.charAt(i)) >= 0) {
      return true;
    }
  }
  return false;
}

// Examples
pairs = [[123, 124], [11, 13], [25, 35], [15, 21], [138, 546], [1, 2], [1, 1]];
pairs.forEach((pair) => console.log(`Compare [${pair[0]}, ${pair[1]}]: ${compareNumbers(pair[0], pair[1])}`));
0 голосов
/ 08 января 2019

Я думаю, что было бы лучше рассмотреть это математически, в отличие от простого добавления 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.

0 голосов
/ 08 января 2019

Вам не нужно разбивать строку, чтобы получить доступ к ее содержимому в виде массива.

var digitsCompare = compareNumber.toString();
console.log(digitsCompare.charAt(0)); <-- first char
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...