1. 程式人生 > >排列組合相關筆試面試題(C++)

排列組合相關筆試面試題(C++)

一、常考點 含有相同元素的全排列:例如2個a,3個b,4個c可以組成多少個不同的字串?9!/2!/3!/4!。 n個人的全排列:排成一排為n!,排成一圈且考慮旋轉帶來的差異也為n!,排成一圈但不考慮旋轉差異則為(n-1)!。 二、普通排列組合練習題 1、X*Y的方格陣中,從左上角走到右下角,每次只能走一格且只能向右走或向下走,有多少種走法 解法:向右一定走Y-1步,向下一定走X-1步,總共要走X+Y-2步,走法有C(X+Y-2,X-1)種。 當n<=10時: 組合數的計算方法一(利用遞迴公式): classRobot { public: intC(intn,intm) { if(m ==1)
returnn; if(m == n || m ==0) return1; returnC(n-1,m-1)+C(n-1,m); } intcountWays(intx,inty) {        returnC(x+y-2,x-1); } }; 組合數的計算方法二(利用定義):
class Robot {public: int countWays(int x, int y) {         int n1 = 1,n2 = 1; for (int i = 1,j = x+y-2;i <= x-1;i++,j--) {             n1 *= i;
            n2 *= j;         } return n2/n1;     } }; 3、n個人站隊,他們的編號依次從1到n,要求編號為a的人必須在編號為b的人的左邊,但不要求一定相鄰,請問共有多少種排法?第二問如果要求a必須在b的左邊,並且一定要相鄰,請問一共有多少種排法? 解法: classStandInLine { public:     // 計算組合數  intC(intn,intm) { if(m ==1) returnn; if(m == n || m ==0) return1; returnC(n-1,m-1)+C(n-1,m);
}     // 計算階乘 intA(intn,intm) { intres =1; for(inti = n;i > n-m;i--) { res *= i; } returnres; } vector<int> getWays(intn,inta,intb) { vector<int> res; res.push_back(A(n-2,n-2)*(C(n-1,2)+C(n-1,1))); res.push_back(A(n-1,n-1)); returnres; } };
4、n顆相同的糖果,分給m個人,每人至少一顆,問有多少種分法。 解法:○○|○○○○○|○○○這10顆糖中間有9個空,插兩個隔板,分成3分,有C(9,2)種分法。 classDistribution { public: intComb(intn,intm) { if(n ==0&& m ==0)return1; if(m ==1)returnn; if(m == n || m ==0)return1; returnComb(n-1,m-1)+Comb(n-1,m); } intgetWays(intn,intm) { returnComb(n-1,m-1); } };
三、複雜排列組合練習題 1、卡特蘭數 當問題可以表示成以下兩種形式時,就是卡特蘭數問題。f(n)= C(2*n,n)/(n+1)。 ①f(n) = f(0)*f(n-1)+f(1)*f(n-2)+……+f(n-2)*f(1)+f(n-1)*f(0); ②f(n) = C(2*n,n)-C(2*n,n+1)。 2、n對左右括號,請求出合法的排列有多少個 解法:將左括號記為1,右括號記為-1,則n對左右括號的序列就是1、-1序列,從左到右遍歷該序列,並將遍歷元素值疊加記為sum,假設遍歷到第j個時sum=0說明在j的左邊除了與j配對的括號對合法外,已遍歷的j/2-1對括號也是合法的括號序列,剩下的(2n-j)/2對括號也是合法的括號序列,則這種情況的組合總數為f(j/2-1)*f(n-j/2),依次類推可知f(n) = f(0)*f(n-1)+f(1)*f(n-2)+……+f(j/2-1)*f(n-j/2)+……+f(n-2)*f(1)+f(n-1)*f(0) = C(2*n,n)/(n+1)。 classParenthesis { public: intComb(intn,intm) { if(n ==0)return0; if(m ==1)returnn; if(m == n || m ==0)return1; returnComb(n-1,m-1)+Comb(n-1,m); } intcountLegalWays(intn) { returnComb(2*n,n)/(n+1); } };
3、n個數進出棧的順序有多少種 解法:假設進棧前的序列中第i個數在出棧後的序列中也在第i個位置,則說明前i-1個數完成進棧出棧操作後第i個數才進棧出棧,也就是說問題可描述為f(n) = f(0)*f(n-1)+f(1)*f(n-2)+……+f(n-2)*f(1)+f(n-1)*f(0)。
class Stack { public: int countWays(int n) { int c1 =1,c2 =1; for (int i =1;i <= n;i++) c1 *= i; for (int j = n+1;j <=2*n;j++) c2 *= j; return c2/(c1*(n+1));

相關推薦

排列組合相關筆試試題C++

一、常考點 含有相同元素的全排列:例如2個a,3個b,4個c可以組成多少個不同的字串?9!/2!/3!/4!。 n個人的全排列:排成一排為n!,排成一圈且考慮旋轉帶來的差異也為n!,排成一圈但不考慮旋轉差異則為(n-1)!。 二、普通排列組合練習題 1、X*Y的方格陣中,從

二叉樹相關筆試試題

本部落格內容 一、二叉樹的結構 二、求二叉樹中節點個數 三、求二叉樹的第k層的節點個數 四、求二叉樹的葉子節點的個數 五、求二叉樹的深度 六、二叉樹的遍歷(前序、中序、後序) 七、層序遍歷二叉樹(從上到下、從左到右) 八、將二叉搜尋樹變為有序的雙

嵌入式筆試試題1---C++

C++的類的繼承與多型1、是不是一個父類寫了一個virtual 函式,如果子類覆蓋它的函式不加virtual ,也能實現多型? 能2、構造、拷貝構造和賦值運算子的概念3、struct C{C(){cout << "construct: C()" <<

Java筆試試題

共享 ble ati uil sys res 表達式 split 底層 每日一句:想,都是問題;做,才是答案。 構造器Constructor是否可被Override?構造器Constructor不能被繼承,因此不能重寫Override,但是可以被重載Overload。

Java筆試試題

人員 syn 獲得 直接 作用 sleep 超過 分配 bcd 每日一句:我既不悲觀,也不樂觀,只是每天早上睜開眼睛迎接新的一天,一個人努力過下去 1. 下面這條語句一共創建了多少個對象:String s = "a"+"b"+&quo

java筆試試題

oot 控件庫 rect 地址 edi javascrip apach getc mat 每日一句: 你未必出類拔萃,但一定與眾不同。 1. 說說你使用過哪些ajax技術和框架,說它們的區別AJAX(Asynchronous JavaScript And XML,異步Jav

Python Web開發相關試題Django

Python Web開發相關的面試題(Django ) 解釋一下 WSGI 和 FastCGI 的關係? CGI全稱是“公共閘道器介面”(CommonGateway Interface),HTTP伺服器與你的或其它機器上的程式進行“交談”的一種工具,其程式須執行在網路伺服器上。 CGI可

Java異常相關試題

1)java中什麼是Exception ?        簡單的說,異常就是Java傳達給系統的和程式錯誤的方式。在java中,異常功能是通過實現比如 Throwable,Exception,RuntimeException 之類的,然後還有一些處理異常時候的關鍵字,比如:

UE4筆試試題

注:後面的題目中,部分題目僅供參考,可能有爭議。1、材質引數、特效引數、聲音引數如何使用?2、若要對打包之後的版本進行跟蹤和除錯,如何操作?3、C++中如何對元件或者Actor設定同步?4、UE4的AA演算法有哪些?5、四元數相對於尤拉角的優點。6、簡述A*演算法。7、UE4

UE4筆試試題

1、在Actor中增加了輸入事件,但是輸入事件卻無法觸發,其原因可能有哪些?2、SpawnActor的位置不對,為什麼?3、在BeginPlay之後呼叫了某個RPC操作,客戶端卻沒有執行到,可能原因是什麼?4、在客戶端沒有連線到伺服器之前,有什麼同伺服器進行通訊的方案嗎?5、

每天五個java相關試題8--spring篇

ioc 簡單 組件 print 提交數據 常常 spring容器 效果 用戶 首先呢,假設有從事前端開發的大神或者準備從事前端開發的小夥伴無意看到我這篇博客看到這段文字歡迎加我的QQ:【 845415745 】。即將走入社會的菜鳥大學生有關於前端開發的職

筆試試題待完善

試題 一行 class int pan 代碼 print nbsp spa 1. 用一行代碼交換a,b的值 a,b = 1,2 print(a,b) a,b = b,a print(a,b) 筆試面試題(待完善)

LINUX相關技術試題命令,vi編輯器,常見面試問題

LINUX相關技術面試題 基礎命令: 1.查詢檔案 find / -name filename.txt 根據名稱查詢/目錄下的filename.txt檔案。 2.檢視一個程式是否執行 ps –ef|grep tomcat 檢視所有有關tomcat的程序 3.終止執行緒

一道試題C語言

題:輸入一個數,列出所有加和等於該數的式子。 分析: 以 6 為例: 從上面的分析就比較容易找到規律了。 C語言程式碼: 1 #include <stdio.h> 2 3 int main() 4 { 5 int n; // 輸入的數 6

C++試題基礎

2018秋招經歷的一些面試題以及網上整理的面試題 一、Tcp的三次握手和四次揮手 三次握手: 四次揮手:   二、Tcp為什麼要三次握手?(詳情參考https://www.jianshu.com/p/e7f45779008a,或計算機網路這本書) 三次握手的目的是“為

大資料社群整理的Linux運維筆試試題47題

Linux作業系統知識 1. Linux開機啟動流程詳細步驟是什麼?忘記密碼如何破解? 2. 企業中Linux資料庫伺服器做raid幾,你們原來公司的資料庫伺服器大小?RAID 0 1 5 10區別,系統分割槽標準是什麼? 3. 某一天突然發現Linux系統檔案只讀,該怎麼辦呢?寫一下完整操作步驟,

百度研發類試題C++方向

第一篇 1、在函式內定義一個字元陣列,用gets函式輸入字串的時候,如果輸入越界,為什麼程式會崩潰? 答:因為gets無法截斷陣列越界部分,會將所有輸入都寫入記憶體,這樣越界部分就可能覆蓋其他內容,造成程式崩潰。 2、C++中引用與指標的區別 答:聯絡:引用是變數的別名,

C/C++試題3——劍指offer1賦值運算子函式

今天又複習了C++面試題,這道題的目的是:給出一個類的宣告,然後寫出這個類的建構函式、解構函式、拷貝建構函式和運算子過載函式。 題目 //題目:如下為型別CMyString的宣告,請為該型別新增賦值

每天五個java相關試題9--java基礎詳解篇1

接下來會系統的總結java基礎,然後過兩天會開始從新開始複習前端並更新和總結一些關於前端的基礎知識和麵試題,嗯嗯我是一個想走前端的後端java工程師啊哈哈。馬上開學大四了,lz我要加油啦~ 接下來的面試題會學習我們班小夥伴的好學習方法,一個個刨根問底了,理清楚

C語言基礎試題

1.寫出判斷ABCD四個表示式的是否正確, 若正確, 寫出經過表示式中 a的值 int a = 4; (A)a += (a++); (B) a += (++a) ;(C) (a++) += a;(D) (++a) += (a++); a = ?答:C錯誤,左側不是一個有效變