我目前正致力于coderbyte的媒体挑战,名为“排列步骤”。
目标是获取用户输入num,并使用相同的数字返回下一个大于num的数字因此,例如,如果用户输入为123,那么数字132应为回。如果用户输入为12453,则应返回12534 ...
Anywho,我有一个正确的模型答案由某人创建(可能是一个天才,因为这个东西很难)而且我想弄清楚答案是如何工作的,通过一个例子播放出行(I保持简单并用用户输入123播放功能。
答案有两个功能,但使用的第一个功能是我目前正在努力解决的问题......
相关代码是:
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;
}
}
同样,我正在尝试通过此函数将输入的数字设为123(num = 123)。
我很确定这个函数应该输出一个包含多个元素的数组,因为第二个函数只是将这些数组元素与原始用户输入(在我们的例子中为123)进行比较,并返回下一个最大值。
所以在我们的例子中,我们应该得到一个名为'ar'的数组,返回一个3位数的主机。但由于某种原因,我得到一个2位数值的数组。我似乎无法孤立我的错误和我出错的地方。任何帮助,特别是我出错了(无论是递归,使用substring-method,还是将字符串连接在一起,无论我的问题是什么)都将不胜感激...
到目前为止,这是我的一些工作:
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;
}
答案 0 :(得分:1)
好的,这是我的解决方案,我在20分钟内找到了它;)
//---- num should be a Number Object and not a String function getNextNumber (num) { var numberStr=num.toString (), l=numberStr.length, i; var digits=new Array (), digitA, digitB; var weight,lightWeight; var valueDifference,biggerValue; for (i=l-1;i>-1;i--) digits.push (parseInt(numberStr.charAt(i))); // 345 becomes a0=5 a1=4 a2=3 and we can say that num= a0*10^0+ a1*10^1+ a2*10^2, so the index becomes the decimal weight for (weight=1;weight<l;weight++) { digitA=digits[weight]; biggerValue=new Array (); for (lightWeight=weight-1;lightWeight>-1;lightWeight--) { digitB=digits[lightWeight]; if (digitB==digitA) continue; valueDifference=(digitA-digitB)*(-Math.pow(10,weight)+Math.pow (10,lightWeight)); if (valueDifference>0) biggerValue.push(valueDifference); } if (biggerValue.length>0) { biggerValue.sort(); return (biggerValue[0]+num); } } }
答案 1 :(得分:1)
对不起,我发布的第一个功能是在一个数学逻辑错误下,而我是在过分夸张 我再次考虑它,现在我有以下功能,definitley工作
function getNextNumber (num) { var numberStr=num.toString (), l=numberStr.length, i; var digits=new Array (), lighterDigits, digitAtWeight; var weight,lightWeight, lighterDigits_l, value=0; for (i=l-1;i>-1;i--) digits.push (parseInt(numberStr.charAt(i))); lighterDigits=new Array (); lighterDigits.push (digits[0]); for (weight=1;weight<l;weight++) { digitAtWeight=digits[weight]; lighterDigits_l=lighterDigits.length; for (lightWeight=0;lightWeight<lighterDigits_l;lightWeight++) { if (digitAtWeight<lighterDigits[lightWeight]) { lighterDigits.unshift (lighterDigits.splice (lightWeight,1,digitAtWeight)[0]); lighterDigits.reverse (); digits=lighterDigits.concat (digits.slice (weight+1,l)); for (weight=0;weight>l;weight++) value+=Math.pow (10,weight)*digits[weight]; return value; } } lighterDigits.push (digitAtWeight); } return NaN; }
答案 2 :(得分:1)
这是我在没有使用递归函数的情况下解决问题的解决方案。它通过了所有关于coderbyte的测试。我还是新手,所以使用递归并不是我想要的第一件事。希望这可以帮助其他寻求解决方案的人。
function PermutationStep(num) {
var numArr = (num + '').split('').sort().reverse();
var numJoin = numArr.join('');
for (var i = (num + 1); i <= parseInt(numJoin); i++){
var aaa = (i + '').split('').sort().reverse();
if (aaa.join('') == numJoin){
return i;
}
}
return -1;
}