智商檢測(cè)?華為筆試題居然這么簡(jiǎn)單!
點(diǎn)擊上方藍(lán)字,關(guān)注并星標(biāo),和我一起學(xué)技術(shù)。
大家好,今天給大家?guī)?lái)的是華為的編程筆試題,一共三題,由于題目比較簡(jiǎn)單,所以就不分章節(jié)了,一口氣全部寫(xiě)完,讓大家看個(gè)過(guò)癮。
題目來(lái)源于牛客網(wǎng),如果大家想要親自上手實(shí)戰(zhàn)的話,可以點(diǎn)擊下方閱讀原文進(jìn)行跳轉(zhuǎn)。
汽水問(wèn)題
有這樣一道智力題:“某商店規(guī)定:三個(gè)空汽水瓶可以換一瓶汽水。小張手上有十個(gè)空汽水瓶,她最多可以換多少瓶汽水喝?”答案是5瓶,方法如下:先用9個(gè)空瓶子換3瓶汽水,喝掉3瓶滿的,喝完以后4個(gè)空瓶子,用3個(gè)再換一瓶,喝掉這瓶滿的,這時(shí)候剩2個(gè)空瓶子。然后你讓老板先借給你一瓶汽水,喝掉這瓶滿的,喝完以后用3個(gè)空瓶子換一瓶滿的還給老板。如果小張手上有n個(gè)空汽水瓶,最多可以換多少瓶汽水喝?
輸入描述:
輸入文件最多包含10組測(cè)試數(shù)據(jù),每個(gè)數(shù)據(jù)占一行,僅包含一個(gè)正整數(shù)n(1<=n<=100),表示小張手上的空汽水瓶數(shù)。n=0表示輸入結(jié)束,你的程序不應(yīng)當(dāng)處理這一行。
輸出描述:
對(duì)于每組測(cè)試數(shù)據(jù),輸出一行,表示最多可以喝的汽水瓶數(shù)。如果一瓶也喝不到,輸出0。
輸入例子1:
3
10
81
0
輸出例子1:
1
5
40
解法
這是一道經(jīng)典的智力題,主要的trick在于當(dāng)我們有兩個(gè)飲料瓶的時(shí)候,可以通過(guò)向店老板先借一瓶飲料再償還。但這個(gè)trick題目當(dāng)中已經(jīng)寫(xiě)得很清楚了,基本上可以說(shuō)是沒(méi)有難度了。
我們用一個(gè)變量表示當(dāng)前剩余的飲料瓶的個(gè)數(shù),當(dāng)飲料瓶的個(gè)數(shù)大于等于2的時(shí)候,我們持續(xù)進(jìn)行拿瓶換飲料的操作即可。最后特判一下飲料瓶的數(shù)量等于2的時(shí)候跟老板借一瓶飲料的操作即可。
代碼
int main() {
int x;
while (~scanf("%d", &x) && x != 0) {
int ret = 0;
while (x > 1) {
ret += x / 3;
x = x % 3 + x / 3;
if (x == 2) {
ret ++;
break;
}
}
printf("%d\n", ret);
}
return 0;
}
排序去重問(wèn)題
明明想在學(xué)校中請(qǐng)一些同學(xué)一起做一項(xiàng)問(wèn)卷調(diào)查,為了實(shí)驗(yàn)的客觀性,他先用計(jì)算機(jī)生成了N個(gè)1到1000之間的隨機(jī)整數(shù)(N≤1000),對(duì)于其中重復(fù)的數(shù)字,只保留一個(gè),把其余相同的數(shù)去掉,不同的數(shù)對(duì)應(yīng)著不同的學(xué)生的學(xué)號(hào)。然后再把這些數(shù)從小到大排序,按照排好的順序去找同學(xué)做調(diào)查。請(qǐng)你協(xié)助明明完成“去重”與“排序”的工作(同一個(gè)測(cè)試用例里可能會(huì)有多組數(shù)據(jù)(用于不同的調(diào)查),希望大家能正確處理)。
注:測(cè)試用例保證輸入?yún)?shù)的正確性,答題者無(wú)需驗(yàn)證。測(cè)試用例不止一組。
當(dāng)沒(méi)有新的輸入時(shí),說(shuō)明輸入結(jié)束。
輸入描述:
注意:輸入可能有多組數(shù)據(jù)(用于不同的調(diào)查)。每組數(shù)據(jù)都包括多行,第一行先輸入隨機(jī)整數(shù)的個(gè)數(shù)N,接下來(lái)的N行再輸入相應(yīng)個(gè)數(shù)的整數(shù)。具體格式請(qǐng)看下面的"示例"。
輸出描述:
返回多行,處理后的結(jié)果
輸入例子1:
3
2
2
1
11
10
20
40
32
67
40
20
89
300
400
15
輸出例子1:
1
2
10
15
20
32
40
67
89
300
400
例子說(shuō)明1:
樣例輸入解釋:
樣例有兩組測(cè)試
第一組是3個(gè)數(shù)字,分別是:2,2,1。
第二組是11個(gè)數(shù)字,分別是:10,20,40,32,67,40,20,89,300,400,15。
解法
這題同樣不難,只需要按照要求實(shí)現(xiàn)排序和去重的功能即可。
由于題目當(dāng)中沒(méi)有限制不可以使用STL庫(kù),所以我們可以直接使用set、sort等工具,非常方便。這里關(guān)于去重有很多種實(shí)現(xiàn)方案,既可以通過(guò)set、map等數(shù)據(jù)結(jié)構(gòu)在插入的時(shí)候就做好去重,也可以利用排序的有序性在打印的時(shí)候進(jìn)行過(guò)濾。這兩種相差不大,只不過(guò)后者可以免除使用數(shù)據(jù)結(jié)構(gòu),更加簡(jiǎn)單。
代碼
int main() {
int n;
while (~scanf("%d", &n)) {
vector<int> vt;
for(int i = 0; i < n; i++) {
int x;
scanf("%d", &x);
vt.push_back(x);
}
sort(vt.begin(), vt.end());
for (int i = 0; i < vt.size(); i++) {
if (i == 0 || vt[i] != vt[i-1]) {
printf("%d\n", vt[i]);
}
}
}
return 0;
}
進(jìn)制轉(zhuǎn)換
寫(xiě)出一個(gè)程序,接受一個(gè)十六進(jìn)制的數(shù),輸出該數(shù)值的十進(jìn)制表示。
輸入描述:
輸入一個(gè)十六進(jìn)制的數(shù)值字符串。注意:一個(gè)用例會(huì)同時(shí)有多組輸入數(shù)據(jù),請(qǐng)參考帖子https://www.nowcoder.com/discuss/276處理多組輸入的問(wèn)題。
輸出描述:
輸出該數(shù)值的十進(jìn)制字符串。不同組的測(cè)試用例用\n隔開(kāi)。
輸入例子1:
0xA
0xAA
輸出例子1:
10
170
解法
在十六進(jìn)制當(dāng)中,用A-F分別表示10到15。在十進(jìn)制當(dāng)中,每進(jìn)一位單位乘10,在十六進(jìn)制當(dāng)中每進(jìn)一位單位乘16。我們只需要遵循這樣的計(jì)算規(guī)則就可以解出本題。
字符串初始的0x表示這是一個(gè)16進(jìn)制數(shù),并沒(méi)有特殊含義,我們直接忽略即可。
代碼
int main() {
string st;
while (cin >> st) {
int base = 1;
int ret = 0;
for(int i = st.size()-1; i > 1; i--) {
int bit = 0;
if (st[i] >= '0' && st[i] <= '9') {
bit = st[i] - '0';
}else {
bit = 10 + st[i] - 'A';
}
ret += bit * base;
base *= 16;
}
printf("%d\n", ret);
}
return 0;
}
總結(jié)
老實(shí)講我沒(méi)做過(guò)華為的筆試題,但是從聽(tīng)說(shuō)的消息以及拿到的真題來(lái)看,華為的題目算是比較基礎(chǔ)。考察的與其說(shuō)是候選人的算法、數(shù)據(jù)結(jié)構(gòu)的能力倒不如說(shuō)是更多的考察的是基本功。
對(duì)于C++來(lái)說(shuō)除了基本的語(yǔ)法之外,對(duì)于常用的STL庫(kù)同樣需要有所了解。比如vector、algorithm、map、set等,熟練地使用他們可以節(jié)省大量的工作,極大地簡(jiǎn)化編碼。
好了,今天的文章就到這里,感謝大家的閱讀,喜歡的話不要忘了三連或給個(gè)星標(biāo)。
