javascript - 循环通过拆分数字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);
解决方案
我认为最好从数学上考虑这一点,而不是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
.
推荐阅读
- python - Transform output in json format
- react-native - react native maps crashes on Standalone version from Google Play
- javascript - I've got different behavior for object assign on localhost vs Server
- scala - IntelliJ 不能识别 Scala 项目中的 protobuf 吗?
- reactjs - Flat List renderItem is called when there is any state change not related to flatlist data?
- c++ - 如何在 Eigen 中声明稀疏矩阵的向量
- php - 无法验证时间戳:在 laravel saml 中过期
- azure - Azure 数据库 for MySQL 和 Azure SQL 数据库之间的区别
- powershell - Powershell-在深埋且不知道完整路径的子文件夹中创建文件夹
- flutter - 可选参数的默认值必须是常量。扑