6× 9的的方格中,起點的左下角,終點在右上角,從起點到終點,只能從下向上,從左向右走,問一共有多少種不一樣的走法。
A. 4200
B. 5005
C. 1005
D. 以上都不正確java
固然這道題有點異議,爲何這樣說呢?由於題目沒有明確說明是按方格來走仍是按照線來走。git
首先咱們嘗試下按方格來走,獲得的結果是什麼?要想知道結果,咱們須要知道題目想考察咱們什麼,很顯然,題目其實考察咱們高中很是熟悉的排列組合的問題,完徹底全就是高中的題目,但是如今可能對於咱們來講又是如此的陌生。這道題若是按方格來走的話,結果就是 C(5, 13) = 1287 。13 是哪裏來的,5 又是哪裏來的,思考以前,咱們能夠先看一張圖。github
根據圖片能夠看出,13 就從左下角到右上角一個要走的格子數,5 就是走的行數,爲何是從 13 箇中選 5 個來組合就知道一共有多少種走法呢?其實由於咱們只要知道了行數的 5 個的位置咱們就知道列數 8 個格子的位置,固然你也能夠 13 選 8 ,結果都是同樣的。爲啥同樣,貼一張圖來回憶起咱們遺忘的記憶吧。面試
所以,按走的是格子來算,結果是 C(5, 13) = C(8, 13) = 1287編程
其實這道題目想表達的意思是按線來算的,但是原理仍是跟上面同樣的ui
所以,按走的是線來算,結果是 C(6, 15) = C(9, 15) = 5005spa
其實這種題目不少大企業大公司都會做爲面試題,好比咱們來看看下面兩道相似的題目:code
1.阿里巴巴的筆試題目圖片
說 16 我的按順序去買燒餅,其中 8 我的每人身上只有一張 5 塊錢,另外 8 我的每人身上只有一張 10 塊錢。燒餅 5 塊一個,開始時燒餅店老闆身上沒有錢。16 個顧客互相不通氣,每人只買一個。問這 16 我的共有多少種排列方法能避免找不開錢的狀況出現。get
假設付 5 塊錢的人都是 1,付 10 塊錢的人都是 0 ,則排隊順序可能爲1111111100000000 或各類 1 與 0 的排列組合,那麼總共的排列順序就是C(16,8),這裏跟上面的都是同樣的,可是爲了不找不開錢,則從左到右時,不能有 0 的數目小於 1 的數目的狀況出現。若是出現這種狀況,則必然存在第2m+1 個數目時(即某個奇數數目),前 2m+1 個數目中有 m+1個0,m 個 1 。那麼在剩餘的 16-2m-1 個數目中,即 15-2m 個數目中,必然存在着 8-m-1 個 0 ,8-m 個 1 ,即 7-m 個 0 ,8-m 個 1 。如今再把剩餘的 16-2m-1 個數目中的 0 與 1 互換,則爲 8-m 個0,7-m 個 1 ,這個時候,整個數列就變爲了 9 個 0,7 個 1 。因此一個不符合要求的數目爲 9 個 0 和 7 個 1 組成。所以,結果爲 C(16,8)-C(16,9)= 12870 - 11440 = 1430
2.2012騰訊實習招聘筆試題
在圖書館一共6我的在排隊,3個還《面試寶典》一書,3個在借《面試寶典》一書,圖書館此時沒有了面試寶典了,求他們排隊的總數?
其實這些問題能夠轉化爲下面的格路問題,從左下角到右上角,不能是對角線,有多少種方案。不過加了限制條件而已,這道題跟阿里巴巴那道面試題同樣,結果爲:結果爲 C(6,3)-C(6,4)= 20 - 15 = 5
GitHub:https://github.com/TwoWater/Interview/tree/master/Interview
package com.liangdianshui; /** * <p> * 6× 9的的方格中,起點的左下角,終點在右上角,從起點到終點,只能從下向上,從左向右走,問一共有多少種不一樣的走法。 * A. 4200 * B. 5005 * C. 1005 * D. 以上都不正確 * </p> * * @author liangdianshui * */ public class Catalan { public static void main(String[] args) { System.out.println(func(6, 9)); } public static int func(int m, int n) { if (m < 1 || n < 1) { return 1; } return func(m - 1, n) + func(m, n - 1); } }