【发布时间】:2014-03-10 00:45:51
【问题描述】:
我目前正在处理 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;
}
【问题讨论】:
标签: javascript for-loop recursion substr