1. 程式人生 > >面試演算法題:爬樓梯,N級樓梯有多少種走法?

面試演算法題:爬樓梯,N級樓梯有多少種走法?

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("完成");
    }
}

Created by Long Luo at 2015-04-08 00:40:12 @Shenzhen, China.

Completed By Long Luo at 2015-04-08 18:15:38 @Shenzhen, China.