我目前正在从事coderbyte的中等挑战,题为“置换步骤”。
目标是获取用户输入num,并使用相同的数字返回下一个大于num的数字。例如,如果用户输入为123,则应返回数字132。如果用户输入为12453,则应返回12534 ...
任何人,我都有一个人创建的正确模型答案(可能是一个天才,因为这很困难),我试图通过一个示例来逐行说明答案的工作原理(我一直在简单易用,并通过用户输入123播放该功能)。
答案有2个功能,但是使用的第一个功能是我目前正在尝试的功能...
相关代码为:
var PermutationStep1 = function(num) {
var num1 = num.toString();
var ar = [];
//return num1;
if (num1.length < 2) {
return num;
} else {
for(var i = 0; i < num1.length; i++) {
var num2 = num1[i];
var num3 = num1.substr(0,i) + num1.substr(i+1, num1.length -1);
var numAr = PermutationStep1(num3);
for(var j = 0; j < numAr.length; j++) {
ar.push(numAr[j] + num2);
}
}
ar.sort(function(a,b) {return a-b});
return ar;
}
}
再次,我试图通过此函数使用输入的num为123(num = 123)进行工作。
我非常确定该函数应该输出包含多个元素的数组,因为第二个函数仅将这些数组元素与原始用户输入(在我们的示例中为123)进行比较,并返回下一个最大值。
因此,在我们的例子中,我们可能应该得到一个名为“ ar”的数组,该数组返回一个包含3位数字的值。但是由于某种原因,我得到了一个2位数字的数组。我似乎无法隔离自己的错误以及我要去哪里。特别是在我出错的地方提供的任何帮助(无论是递归,子字符串方法的使用还是字符串的合并,无论我遇到什么问题)...
到目前为止,这是我的一些工作:
PS1(123) / num1 = 123
i = 0;
num2 = (num1[i]) = '1';
num3 = (num1.substr(0, 0) + num1.substr(1, 2)) = ('0' + '23') = '23'
PS1(23)
i = 0;
num2 = '2';
num3 = '3'
PS1(3) -> numAr = 3 (since num1 is less than 2 digits, which is the recursion base case?)
(So take 3 into the 2nd for loop)...
ar.push(numAr[j] + num2) = ar.push('3' + '1') = 31
ar = [31] at this point
And then I go through the initial for-loop a couple more times, where i = 1 and then i = 2, and I eventually get....
ar = [31, 32, 33]...
但是我想我应该有类似ar = [131,132,133]的东西吗?我不确定我要去哪里哪里,所以请帮忙。因为此功能正确地吐出了答案,所以正确答案是132。
注意:如果您需要模型答案的第二部分(即第二功能),则为:
var arr = [];
function PermutationStep(num1) {
arr.push(PermutationStep1(num1));
var arrStr = arr.toString();
var arrStrSpl = arrStr.split(",");
//return arrStrSpl;
for(var p = 0; p < arrStrSpl.length; p++) {
if(arrStrSpl[p] > num1) {
return arrStrSpl[p];
}
}
return -1;
}
最佳答案
对不起,我发布的第一个函数出现了数学上的逻辑错误,我想改头换面
我再次考虑了一下,现在我有以下definitley工作的功能
函数getNextNumber(数字)
{
var numberStr = num.toString(),l = numberStr.length,i;
var digits = new Array(),lighterDigits,digitAtWeight;
var weight,lightWeight,lighterDigits_l,value = 0;
对于(i = l-1; i> -1; i--)
digits.push(parseInt(numberStr.charAt(i)));
lighterDigits = new Array();
lighterDigits.push(digits [0]);
对于(weight = 1; weight {
digitAtWeight = digits [weight];
lighterDigits_l = lighterDigits.length;
为(lightWeight = 0; lightWeight {
如果(digitAtWeight {
lighterDigits.unshift(lighterDigits.splice(lightWeight,1,digitAtWeight)[0]);
lighterDigits.reverse();
digits = lighterDigits.concat(digits.slice(weight + 1,l));
对于(weight = 0; weight> l; weight ++)
value + = Math.pow(10,weight)* digits [weight];
返回值
}
}
lighterDigits.push(digitAtWeight);
}
返回NaN;
}
关于javascript - Javascript:使用for循环和子字符串的递归函数示例-无法弄清楚我要去哪里,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21715283/