我有这个功能,我想遍历两个字符串和 收到最接近它的compareNumber的返回值-即(compareNumber +1),但前提是它的任何一个数字都不等于searchNumber的任何数字。如果compareNumber的任何数字等于searchNumber的任何数字,我需要查找大于compareNumber的第一个值,该值不等于searchNumber的任何数字。
checkboxMutator = function (value, data) {
return '<input type="checkbox" class="rowCheckBox" name="' + value + '">';
}
答案 0 :(得分:0)
代码如下:
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])}`));
答案 1 :(得分:0)
我认为最好从数学角度考虑这一点,而不是一直加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
。
答案 2 :(得分:-2)
您无需拆分字符串即可以数组形式访问其内容。
.transition