我写了一些代码来计算,并打印了用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开始
答案 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
中,您要修改countSoFar
和s
的本地值:
s+=" "+i;
countSoFar+=i;
您应该传递这样的新值:
for(int i=1;i<3;i++){
displayAllPerms(n, countSoFar + i, s + " " + i);
}
这使得当前方法中的countSoFar
和s
的本地值在循环的下一次迭代中保持不变。