**
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 ...