我目前正在从事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/

10-11 05:26