http://bbs.ngacn.cc/read.php?tid=8405951php
發這個沒有別的意思
有不少轉行/自學/經驗少的旁友很好奇真正的面試題是什麼樣子的,也想檢驗下本身什麼水平
正好最近朋友給我看了這個真實的例子,就發來給你們看看
本題不涉及任何特定的算法,數學與專門的理論知識
考察的是基本的邏輯思惟,抽象思惟,基本的算法分析與動手能力
如圖有限狀態機
A,B,C三個狀態
從左邊start進入A開始運行,到達最右邊的end狀態結束
每一個狀態節點有若干條邊來標識狀態轉換的路徑
每一個邊上的符號表明一個機率p,表示到達這個節點後有p的機率走這條路線
機率值精確到2位小數
每一個狀態全部出去的路徑機率之和爲1
好比a1+a2+a3+a4=1
每到達一個狀態後輸出該狀態的字母
若是到達end則中止輸出
那麼根據這個規則,能夠隨機輸出一系列字符串,例如:
AABC
ABCCCAABC
等等
問題:
1. 寫一個程序實現上述字符串輸出
2. 給定一個字符串長度N,寫一個函數計算1中的算法最終輸出字符串長度爲N的機率。
3. 給出2中算法的複雜度,是否有優化方法。
4. 快下班的時候,boss:小李啊,客戶忽然有個需求,要經過讀取配置文件獲得狀態機信息,改下你的程序以支持用戶輸入的任意狀態機,改完了再走吧,打車公司報銷
要求:
手寫代碼
編碼限時15分鐘 (只要有核心功能便可,標準庫隨便用)
複雜度什麼的寫完代碼再慢慢聊ios
1 // 2 // 有限狀態機.cpp 3 // TestAllThings 4 // 5 // Created by 彭威 on 15/7/28. 6 // Copyright © 2015年 NJU. All rights reserved. 7 // 8 /* 9 10 [我也帶來一波節奏]既然想reroll碼農的這麼多,那來作個遊戲吧,真實BAT面試(37樓之後各路高玩出現) 11 發這個沒有別的意思 12 有不少轉行/自學/經驗少的旁友很好奇真正的面試題是什麼樣子的,也想檢驗下本身什麼水平 13 正好最近朋友給我看了這個真實的例子,就發來給你們看看 14 本題不涉及任何特定的算法,數學與專門的理論知識 15 考察的是基本的邏輯思惟,抽象思惟,基本的算法分析與動手能力 16 17 18 如圖有限狀態機 19 A,B,C三個狀態 20 從左邊start進入A開始運行,到達最右邊的end狀態結束 21 每一個狀態節點有若干條邊來標識狀態轉換的路徑 22 每一個邊上的符號表明一個機率p,表示到達這個節點後有p的機率走這條路線 23 機率值精確到2位小數 24 每一個狀態全部出去的路徑機率之和爲1 25 好比a1+a2+a3+a4=1 26 每到達一個狀態後輸出該狀態的字母 27 若是到達end則中止輸出 28 那麼根據這個規則,能夠隨機輸出一系列字符串,例如: 29 AABC 30 ABCCCAABC 31 等等 32 33 問題: 34 1. 寫一個程序實現上述字符串輸出 35 2. 給定一個字符串長度N,寫一個函數計算1中的算法最終輸出字符串長度爲N的機率。 36 3. 給出2中算法的複雜度,是否有優化方法。 37 4. 快下班的時候,boss:小李啊,客戶忽然有個需求,要經過讀取配置文件獲得狀態機信息,改下你的程序以支持用戶輸入的任意狀態機,改完了再走吧,打車公司報銷 38 39 要求: 40 手寫代碼 41 編碼限時15分鐘 (只要有核心功能便可,標準庫隨便用) 42 複雜度什麼的寫完代碼再慢慢聊 43 44 45 46 */ 47 #include <iostream> 48 #include <stdlib.h> 49 #include <vector> 50 #include <string> 51 52 #define Rand ((double)arc4random() / 0x100000000) 53 54 using namespace std; 55 static const int n = 4; 56 static const double p[n][n] = { 57 0.1,0.2,0.3,0.4, 58 0.2,0.3,0.4,0.1, 59 0.3,0.4,0.1,0.2, 60 0 ,0 ,0 ,0 61 }; 62 char print[n] = {'A','B','C','\n'}; 63 class AutoStep { 64 int current; 65 public: 66 AutoStep(int start=0):current(start){}; 67 string start(){ 68 string result; 69 result.push_back(print[current]); 70 while (!isEnd()) { 71 current = makeChoice(); 72 result.push_back(print[current]); 73 } 74 return result; 75 } 76 protected: 77 bool isEnd(){ 78 return (n-1) == current; 79 } 80 int makeChoice(){ 81 vector<double> pro(n); 82 pro[0] = probability(current,0); 83 for (int i = 1; i < n; i++) { 84 pro[i] = pro[i-1] + probability(current,i); 85 } 86 auto iter = lower_bound(pro.begin(), pro.end(), Rand); 87 return (int)(iter - pro.begin()); 88 } 89 double probability(int i,int j){ 90 return p[i][j]; 91 } 92 }; 93 template <typename T> 94 class Matrix { 95 private: 96 T **m; 97 T *m0; 98 unsigned int n; 99 unsigned int K; 100 101 public: 102 Matrix(unsigned int _n,const T *a){ 103 const T *p=a; 104 init(_n); 105 for (int i=0; i<n; i++) 106 for (int j=0; j<n; j++) { 107 m[i][j]=*p++; 108 } 109 110 } 111 Matrix(unsigned int _n){ 112 init(_n); 113 }; 114 void init(unsigned int _n){ 115 n=_n; 116 m = new T*[n]; 117 m0= new T[n*n]; 118 for (int i=0;i<n*n;i++)m0[i]=0; 119 for (int i=0;i<n; i++){ 120 m[i]=&(m0[i*n]); 121 } 122 } 123 Matrix(const Matrix& r){ 124 init(r.n); 125 for (int i=0; i<n; i++) 126 for (int j=0; j<n; j++) { 127 m[i][j]=r.m[i][j]; 128 } 129 } 130 131 Matrix& operator=(const Matrix& r){ 132 for (int i=0; i<n; i++) 133 for (int j=0; j<n; j++) { 134 m[i][j]=r.m[i][j]; 135 } 136 return *this; 137 } 138 Matrix& operator%=(unsigned long long r){ 139 for (int i=0; i<n; i++) 140 for (int j=0; j<n; j++) { 141 m[i][j]%=r; 142 } 143 return *this; 144 } 145 Matrix& operator+=(const Matrix& r){ 146 for (int i=0; i<n; i++) 147 for (int j=0; j<n; j++) { 148 m[i][j]+=r.m[i][j]; 149 150 } 151 return *this; 152 } 153 Matrix& operator*=(const Matrix& r){ 154 Matrix temp(n); 155 for (int i=0; i<n; i++) 156 for (int j=0; j<n; j++) { 157 for (int k=0; k<n; k++) { 158 temp.m[i][j]+=(this->m[i][k]*r.m[k][j]); 159 } 160 } 161 *this=temp; 162 return *this; 163 } 164 void MatrixI(){ 165 for (int i=0; i<n; i++) 166 for (int j=0; j<n; j++) { 167 m[i][j]=0; 168 } 169 for (int i=0; i<n; i++){ 170 m[i][i]=1; 171 } 172 } 173 T value(int i,int j){ 174 return m[i][j]; 175 } 176 }; 177 template <typename T> 178 Matrix<T> operator+(const Matrix<T>& s,const Matrix<T>& r){ 179 Matrix<T> temp(s); 180 temp+=r; 181 return temp; 182 } 183 template <typename T> 184 Matrix<T> operator*(const Matrix<T> &s,const Matrix<T> &r){ 185 Matrix<T> temp(s); 186 temp*=r; 187 return temp; 188 } 189 190 int main(int argc,const char* argv[]){ 191 int N; 192 cin>>N; 193 while (N--) { 194 AutoStep step; 195 cout<<step.start(); 196 } 197 cin>>N; 198 Matrix<double> M(n,*p); 199 vector<Matrix<double>> a; 200 Matrix<double> temp(n); 201 a.push_back(M); 202 for(int i=1;i<=32;i++){ 203 temp=a[i-1]; 204 temp*=temp; 205 a.push_back(temp); 206 } 207 temp.MatrixI(); 208 for (int i=0; i<32; i++) { 209 if (N & (1<<i)) { 210 temp*=a[i]; 211 } 212 } 213 cout<<temp.value(0, n-1)<<endl; 214 return 0; 215 }
輸出結果:面試
問題1算法
10dom
A函數
ACpost
A優化
ACAthis
A編碼
ABBBBCBACBCCBBCBCC
A
ACBC
A
ABAACA
問題2
10
0.0190055
問題3
n^3 * log N
n是狀態機個數,N須要求解的字符串長度
可優化的地方不少,n比較大的時候用Strassen算法,n^2.81
N達不到2^32 大小的話,用遞歸作,省掉我作的許多計算
寫法不是很優化,矩陣寫的要死人
問題4
只要保存轉移矩陣和狀態就好,一個是n*n矩陣,一個是n矢量,這個不涉及算法。