计算并显示爬楼梯的方法

时间:2016-03-30 01:28:03

标签: java algorithm

我写了一些代码来计算,并打印了用n步骤爬上给定楼梯的方法。

一次只能爬1或2个楼梯。我知道这是一个已知的面试问题,我写了一些代码与你分享。

问题是我错过了很多序列。能否请您查看并帮助我了解我缺少的逻辑?谢谢你的帮助

我的代码:

/**
 * 
 */
package prep;

/**
 * @author rohandalvi
 *
 */
public class generateAllPermutations {

    /**
     * @param args
     */
    static int totalCounter = 0;
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int numberOfStairs = 10;
        int countSoFar = 0;
        String path = "";
        for(int i=1;i<3;i++){
            path = ""+i;
            displayAllPerms(numberOfStairs, i, path);
        }
        System.out.println("Total combinations found "+totalCounter);
    }

    public static void displayAllPerms(int n,int countSoFar,String s){
        if(countSoFar > n) return;
        else if(countSoFar < n){
            for(int i=1;i<3;i++){
                s+=" "+i;
                countSoFar+=i;
                displayAllPerms(n, countSoFar, s);
            }
        }else{
            System.out.println("Found combination "+s);
            totalCounter++;
            return;
        }
    }

}

结果:

Found combination 1 1 1 1 1 1 1 1 1 1
Found combination 1 1 1 1 1 1 1 1 2
Found combination 1 1 1 1 1 1 1 2 1
Found combination 1 1 1 1 1 1 2 1 1
Found combination 1 1 1 1 1 2 1 1 1
Found combination 1 1 1 1 1 2 1 2
Found combination 1 1 1 1 2 1 1 1 1
Found combination 1 1 1 1 2 1 1 2
Found combination 1 1 1 1 2 1 2 1
Found combination 1 1 1 2 1 1 1 1 1
Found combination 1 1 1 2 1 1 1 2
Found combination 1 1 1 2 1 1 2 1
Found combination 1 1 1 2 1 2 1 1
Found combination 1 1 2 1 1 1 1 1 1
Found combination 1 1 2 1 1 1 1 2
Found combination 1 1 2 1 1 1 2 1
Found combination 1 1 2 1 1 2 1 1
Found combination 1 1 2 1 2 1 1 1
Found combination 1 1 2 1 2 1 2
Found combination 2 1 1 1 1 1 1 1 1
Found combination 2 1 1 1 1 1 1 2
Found combination 2 1 1 1 1 1 2 1
Found combination 2 1 1 1 1 2 1 1
Found combination 2 1 1 1 2 1 1 1
Found combination 2 1 1 1 2 1 2
Found combination 2 1 1 2 1 1 1 1
Found combination 2 1 1 2 1 1 2
Found combination 2 1 1 2 1 2 1
Found combination 2 1 2 1 1 1 1 1
Found combination 2 1 2 1 1 1 2
Found combination 2 1 2 1 1 2 1
Found combination 2 1 2 1 2 1 1

基本上,我缺少像:

这样的组合
2 2 2 2 2

还有更多组合,基本上都以2 2开始

2 个答案:

答案 0 :(得分:6)

首先让我说明这个问题的递归方法,我怀疑你已经采取了这种方法。然后,我将继续讨论代码。

爬3步的方法= [爬2步的方法] + [爬1步的方法]。

概括,攀爬的方法n步骤= [攀爬n-1步骤的方式] + [攀爬n-2步骤的方法]。

如果你没有注意到,这就是Fibonacci模式(替代解决方案是简单地返回n+1 th Fibonacci数字;试试看!)。

public int getWays(int n) {
    if(n <= 1) return n;

    int result = 0;
    for (int i = 1; (i <= 2 && i <= n); i++)
        result += getWays(n-i);
    return result;
}

// Usage:
int steps = 4;
getWays(steps + 1);    // 5 ways

现在,如果你想看看所采取的组合。我采取的方法略有不同,我认为更直观。

public static void waysToReachN(int currentValue, int n, List<Integer> pathSoFar) {
    if(currentValue == n) {
        System.out.println(pathSoFar);
        return;
    } else if(currentValue > n) {
        return;
    }
    for(int i = 1 ; i <= 2 ; i++) {
        // add step
        pathSoFar.add(i);

        // recurse
        waysToReachN(currentValue + i, n, pathSoFar);

        // remove step
        pathSoFar.remove(pathSoFar.size()-1);
    }
}

// Usage:
int currentValue = 0, n = 4;
waysToReachN(currentValue, n, new ArrayList<Integer());

所以,我们发现有5种爬楼梯的方法。方法是,

[1, 1, 1, 1]
[1, 1, 2]
[1, 2, 1]
[2, 1, 1]
[2, 2]

如果不清楚,请告诉我。

答案 1 :(得分:1)

在递归方法displayAllPerms中,您要修改countSoFars的本地值:

s+=" "+i;
countSoFar+=i;

您应该传递这样的新值:

for(int i=1;i<3;i++){
    displayAllPerms(n, countSoFar + i, s + " " + i);
}

这使得当前方法中的countSoFars的本地值在循环的下一次迭代中保持不变。