面試演算法題:爬樓梯,N級樓梯有多少種走法?
阿新 • • 發佈:2019-01-11
By Long Luo
最近去面試時,在一家小公司面試時,公司小BOSS給我出了一道演算法題:
一個人爬樓梯,一步可以邁一級,二級,三級臺階,如果樓梯有N級,要求編寫程式,求總共有多少種走法。
這個問題應該是一個很老的題目了,用中學數學來說,就是一個排列組合問題
。當時拿到這個題目之後,首先想到使用遞迴
的思想去解決這個問題:
N級樓梯問題可以劃分為:N-1級樓梯,N-2級樓梯,N-3級樓梯的走法之和。
先計算下0,1,2,3及樓梯有多少種走法:
1 --> 1
2 --> 11 2
3 --> 111 12 21 3
那麼,根據以上的分析很容易寫出如下程式碼:
public static int countNumber(int stepsNum) { int sum = 0; if (stepsNum == 0) { return 0; } if (stepsNum == 1) { return 1; } else if (stepsNum == 2) { return 2; } else if (stepsNum == 3) { return 4; } else if (stepsNum > 3) { return countNumber(stepsNum - 3) + countNumber(stepsNum - 2) + countNumber(stepsNum - 1); } return sum; } public static void main(String[] args) { for (int i = 0; i <= 10; i++) { System.out.println("樓梯臺階數:" + i + ", 走法有:" + countNumber(i)); } }
再看看輸出:
樓梯臺階數:0, 走法有:0
樓梯臺階數:1, 走法有:1
樓梯臺階數:2, 走法有:2
樓梯臺階數:3, 走法有:4
樓梯臺階數:4, 走法有:7
樓梯臺階數:5, 走法有:13
樓梯臺階數:6, 走法有:24
樓梯臺階數:7, 走法有:44
樓梯臺階數:8, 走法有:81
樓梯臺階數:9, 走法有:149
但是如何求解具體走法呢?
但是僅僅算出有多少種走法是很容易的,基於這個基礎,如何輸出具體的走法
呢?
我們可以使用Stack
資料結構和遞迴
的思想去完成這個題目:
Stack<T>用於儲存每一步的走法。
具體程式碼如下所示:
/** * 一個人爬樓梯,一步可以邁一級,二級,三級臺階,如果樓梯有N級,編寫程式,輸出所有走法。 * * @param args */ public static void main(String[] args) { Stack<Integer> stt = new Stack<Integer>(); buileT(stt, 3); } public static void buileT(Stack<Integer> stt, int N) { if (N >= 1) { stt.push(1); buileT(stt, N - 1); stt.pop(); } if (N >= 2) { stt.push(2); buileT(stt, N - 2); stt.pop(); } if (N >= 3) { stt.push(3); buileT(stt, N - 3); stt.pop(); } if (N == 0) { for (int i : stt) { System.out.print("Step:" + i + "-->"); } System.out.println("完成"); } }