算法题:N级台阶(比如100级),每次可走1步,2步,3步,求总共有多少种走法?
平常不怎么研究算法,直到一次面试后,面试官给我了一个算法题,因为平常没有去看过类似的东西,所以就做错了
根据上面的题目我们可以先暴力解题,假设N=3,那么走法就有以下4种:111,12,21,3。
根据这个规则我们可以发现,步数都是由1,2,3个相加形成,简单的解题可以使用递归:
static int suanFaTest(int len){
if(len == 0){
return 0;
}else if(len == 1){
return 1;
}else if(len == 2){
return 2;
}else if(len == 3){
return 4;
}else {
return suanFaTest(len - 1)+suanFaTest(len - 2)+suanFaTest(len - 3);
}
}
但是如果面试官比较变态,让你把每一种走法都输出,有下面这种方法:
static final int s = 3; //自定义的台阶数
static int len = 0, sum = 0;
//最多也只有走100步就到了
static int step[] = new int[s];
//3
static void compute(final int stair) {
if (stair < 0)
return;
//表示已经走完了
if (stair == 0) {
printSum();
sum++;
return;
}
//每次到下一步选择时都可以走1-3步
for (int i = 1; i <= 3; i++) {
step[len] = i;
len++;
//进行下一步的迭代,迭代完之后将每后加上的一步去掉,换成其它的步数(如从1换成2)
compute(stair - i);
len--;
}
}
static void printSum() {
System.out.print("走法:");
for (int i = 0; i < len; i++)
System.out.print(step[i] + " ");
System.out.println();
}
public static void main(String[] args) {
compute(s);
System.out.println("共有" + sum + "种走法");
}
输入5,控制台输出如下:
我第一次写记录代码生活,如果对你有帮助,我会很高兴~
如果你们有其它解题思路我们可以一起讨论