日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

2011Google校园招聘笔试题

發布時間:2024/7/19 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2011Google校园招聘笔试题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、已知兩個數字為1~30之間的數字,甲知道兩數之和,乙知道兩數之積,甲問乙:“你知道是哪兩個數嗎?”乙說:“不知道”。乙問甲:“你知道是哪兩個數嗎?”甲說:“也不知道”。于是,乙說:“那我知道了”,隨后甲也說:“那我也知道了”,這兩個數是什么?

答:1和4 或者1和7

2、一個環形公路,上面有N個站點,A1, ..., AN,其中Ai和Ai+1之間的距離為Di,AN和A1之間的距離為D0。
高效的求第i和第j個站點之間的距離,空間復雜度不超過O(N)
它給出了部分代碼如下:
#define N 25
double D[N]
....
void Preprocess()
{
???? //Write your code1;
}
double Distance(int i, int j)
{
????? //Write your code2;
}

const int N = 10; int D[N];int A1toX[N];void Preprocess() {srand(time(0));for (int i = 0; i < N; ++i){D[i] = (rand()/(RAND_MAX+1.0)) * N;}A1toX[1] = D[1]; //from A1 to A2for (int i = 2; i < N; ++i){A1toX[i] = A1toX[i-1] + D[i]; //distance from A1 to each point}A1toX[0] = A1toX[N-1] + D[0]; // total length }int distance(int i, int j) {int di = (i == 0) ? 0 : A1toX[i-1];int dj = (j ==0) ? 0 : A1toX[j-1];int dist = abs(di - dj);return dist > A1toX[0]/2 ? A1toX[0] - dist : dist; }int main(void) {Preprocess();for (int i = 0; i <N; ++i){cout<<D[i]<<" ";}cout<<endl;for (int i = 1; i <= N; ++i){cout<<"distance from A1 to A"<<i<<": "<<distance(1, i)<<endl;}return 0; }

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

#include<iostream> #include<cstdio> #include<stack> #include<string> using namespace std;string reverse(string str) {stack<char> stk;int len = str.length();string ret = "";for (int p = 0, q = 0;p < len;){if (str[p] == ' '){ret.append(1,' ');for (q = p; q < len && str[q] == ' '; q++){}p = q;}else{for (q = p; q < len && str[q] != ' '; q++){stk.push(str[q]);}while(!stk.empty()){ret.append(1,stk.top());stk.pop();}p = q;}}return ret; } int main(void) {string s = "abc def ghi";cout<<reverse(s).c_str()<<endl;return 0; } 4、將一個較大的錢,不超過1000000(10^6)的人民幣,兌換成數量不限的100、50、10、5、2、1的組合,請問共有多少種組合呢?(完全背包)(其它選擇題考的是有關:操作系統、樹、概率題、最大生成樹有關的題,另外聽老夢說,谷歌不給人霸筆的機會。)。

第一種方法(母函數):

#define NUM 7 int money[NUM] = {1, 2, 5, 10, 20, 50, 100};// 母函數解法 int NumOfCoins(int value) {int i , j , k , c1[1010] , c2[1010];for(i = 0 ; i <= value ; ++i){c1[i] = 1;c2[i] = 0;}//第一層循環是一共有 n 個小括號,而剛才已經算過一個了 // i 就是代表的母函數中第幾個大括號中的表達式 for(i = 1 ; i < NUM ; ++i){for(j = 0 ; j <= value ; ++j) //j 就是指的已經計算出的各項的系數{for(k = 0 ; k+j <= value ; k += money[i]) //k 就是指將要計算的那個括號中的項c2[k+j] += c1[j];}for(j = 0 ; j <= value ; ++j) // 刷新一下數據,繼續下一次計算,就是下一個括號里面的每一項{c1[j] = c2[j];c2[j] = 0;}}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)

#define NUM 7 int money[NUM] = {1, 2, 5, 10, 20, 50, 100}; // 動態規劃解法 int NumOfCoins(int value) {int i , j , t , dp[7][1010];for(i = 0 ; i <= value ; ++i)dp[0][i] = 1;for(i = 1 ; i < NUM ; ++i){for(j = 0 ; j <= value ; ++j){t = j;dp[i][j] = 0;while(t >= 0){dp[i][j] += dp[i-1][t];t -= money[i];}}}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):

#define NUM 7 int money[NUM] = {1, 2, 5, 10, 20, 50, 100}; // 動態規劃解法(完全背包) int NumOfCoins(int value) {int i , j , dp[7][1010];for(i = 0 ; i <= value ; ++i)dp[0][i] = 1;for(i = 1 ; i < NUM ; ++i){for(j = 0 ; j <= value ; ++j){if(j >= money[i])dp[i][j] = dp[i][j - money[i]] + dp[i - 1][j];elsedp[i][j] = dp[i-1][j];}}return dp[6][value]; } 或者使用滾動數組也是可以的
#define NUM 7 int money[NUM] = {1, 2, 5, 10, 20, 50, 100}; int f[1010] , bf[1010]; // f[j] == f[i][j] bf[j] == bf[i-1][j] int NumofCoin2(int value) {int i , j;for(j = 0 ; j <= value ; ++j)f[j] = 0 , bf[j] = 0;bf[0] = 1;for(i = 0 ; i < NUM ; ++i){for(j = 0 ; j <= value ; ++j){if(j >= money[i])f[j] = f[j-money[i]] + bf[j];elsef[j] = bf[j] ;}for(j = 0; j <= value ; ++j)bf[j] = f[j] , f[j] = 0;}return bf[value];}
引用: http://blog.henix.info/blog/google-exam-integer-partition.html
http://www.cnblogs.com/alexyang8/archive/2011/10/15/2212850.html
http://hi.baidu.com/lennydou/item/93a210c44c6a4977cfd4f80c

總結

以上是生活随笔為你收集整理的2011Google校园招聘笔试题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。