2012谷歌校園招聘筆試

2021-06-19 22:30:23 字數 3438 閱讀 3533

**

1、已知兩個數字為1~30之間的數字,甲知道兩數之和,乙知道兩數之積,甲問乙:「你知道是哪兩個數嗎?」乙說:「不知道」。乙問甲:「你知道是哪兩個數嗎?」甲說:「也不知道」。於是,乙說:「那我知道了」,隨後甲也說:「那我也知道了」,這兩個數是什麼?

答:2、乙個環形公路,上面有n個站點,a1, ..., an,其中ai和ai+1之間的距離為di,an和a1之間的距離為d0。

高效的求第i和第j個站點之間的距離,空間複雜度不超過o(n)

它給出了部分**如下:

#define n 25

double d[n] 

....

void preprocess()

double distance(int i, int j)

[cpp]view plain

copy

const

intn = 10;  

intd[n];  

inta1tox[n];  

void

preprocess()  

a1tox[1] = d[1];     //from a1 to a2

for(

inti = 2; i 

a1tox[0] = a1tox[n-1] + d[0];    // total length

}  int

distance(

inti, 

intj)  

intmain(

void

)    

cout

(int

i = 1; i <= n; ++i)  

return

0;  

}  

3、 乙個字串,壓縮其中的連續空格為1個後,對其中的每個字串逆序列印出來。比如"abc   efg  hij"列印為"cba gfe jih"。

[cpp]view plain

copy

#include

#include

#include

#include

using

namespace

std;  

string reverse(string str)  

p = q;  

}  else

while

(!stk.empty())  

p = q;  

}  }  

return

ret;  

}  int

main(

void

)     

4、將乙個較大的錢,不超過1000000(10^6)的人民幣,兌換成數量不限的100、50、10、5、2、1的組合,請問共有多少種組合呢?(完全揹包)(其它選擇題考的是有關:作業系統、樹、概率題、最大生成樹有關的題,另外聽老夢說,谷歌不給人霸筆的機會。)。

第一種方法(母函式):

[cpp]view plain

copy

#define num 7

intmoney[num] = ;  

// 母函式解法

intnumofcoins(

intvalue)  

//第一層迴圈是一共有 n 個小括號,而剛才已經算過乙個了   

// i 就是代表的母函式中第幾個大括號中的表示式 

for(i = 1 ; i 

for(j = 0 ; j <= value ; ++j)  

// 重新整理一下資料,繼續下一次計算,就是下乙個括號裡面的每一項

}  return

c1[value];  

}  

第二種方法(動態規劃):

我們可以將它形式化為:

硬搜的話肯定是可以出結果的,但時間複雜度太高。

第一種方法:

設 f[n] 為用那麼多種面值組成 n 的方法個數。則 f[n] 可以分成這樣互不重複的幾個部分:

只用 50 及以下的面值構成 [n] + 0 張 100

只用 50 及以下的面值構成 [n-100] + 1 張 100

只用 50 及以下的面值構成 [n-200] + 2 張 100

……也就是說,按 f[n] 的組成方案中 100 的張數,將 f[n] 劃分成若干等價類,等價類的劃分要不重複、不遺漏。這些等價類恰好完整覆蓋了 f[n] 的所有情況。

然後對於 50 及以下的方案又可以按 50 的張數劃分等價類。於是像這樣一層一層遞迴下去……就可以得到結果了。

把上面的遞迴過程反過來,從下往上遞推,這就是動態規劃了。**(用到了一些 c99 特性,比如棧上的可變長陣列):

時間複雜度 < o(n^2)

[cpp]view plain

copy

#define num 7

intmoney[num] = ;  

// 動態規劃解法

intnumofcoins(

intvalue)  

}  }  return

dp[6][value];  

}  

其中 dp[i][j] 表示只用第 i 張面值及以下構成 j 用多少種方法。

改進如下:

a[6][n] = ar[6][n-100]     // 至少包含 1 張 100 的拆分個數

+ ar[5][n]         // 不包含 100 的拆分個數

直接把時間複雜度從 o(n^2) 降到了 o(n):

[cpp]view plain

copy

#define num 7

intmoney[num] = ;  

// 動態規劃解法(完全揹包)

intnumofcoins(

intvalue)  

}  return

dp[6][value];  

}  

或者使用滾動陣列也是可以的

[cpp]view plain

copy

#define num 7  

intmoney[num] = ;   

intf[1010] , bf[1010];  

// f[j] == f[i][j]   bf[j] == bf[i-1][j]

intnumofcoin2(

intvalue)  

for(j = 0; j <= value ; ++j)  

bf[j] = f[j] , f[j] = 0;  

}  return

bf[value];  

}  

引用:

谷歌2013校園招聘筆試題

1.4 小組賽,每個小組有5支隊伍,互相之間打單迴圈賽,勝一場3分,平一場1分,輸一場不得分,小組前三名出線。平分抽籤。問乙個隊最少拿幾分就有理論上的出線希望 a.1 b.2 c.3 d.4 分析 設有a b c d e 5支球隊,假設abc晉級了。如果球隊c積1分可以出現,由於是單迴圈賽,說明他4...

2011谷歌校園招聘筆試題

恢復內容開始 一 單項選擇題 1 從n個未排序的數中尋找中位數 第 n 2 大的數 平均時間複雜度最優演算法的複雜為 a.o logn b.o n c.o nlogn d.o n 2 分析 求無序陣列的中位數 中位數即是排過序後的處於陣列最中間的元素。不考慮陣列長度為偶數的情況。設集合元素個數為n。...

2010谷歌校園招聘筆試題

1 哪個表示式不能用這個匹配 a bc d?a.ad b.abcd c.abc d.abccd 2 intel x86 cpu中,哪種運算最慢 a 加b.減 c.乘d.除 3 下面程式的輸出 include using namespace std intmain else system pause ...