趣味面試題(一)

2021-06-20 07:03:18 字數 3964 閱讀 7981

最近看了不少關於求職面試的試題,在其中發現了不少有意思的題目。特整理後發表上來與大家一起分享。

為了方便與以後新增的題目區別,每次更新會以 a 、 b…… 的方式標註。

a-1 :如何將 a 、 b 的值進行交換,並且不使用任何中間變數?

解析:一般可以選擇兩種方式:

( 1 )使用加法運算: a = a+b; b = a-b; a = a-b;

( 2 )使用異或運算: a = a^b; b = a^b; a = a^b;

其中,如果 a 、 b 的值比較大,那麼選擇第一種方式可能會導致越界,因此,最佳答案是異或方式。

a-2 :main 主函式執行完畢後,是否可能會再執行一段**?

解析:回答是肯定的。可以使用 atexit() 函式註冊乙個函式,使得主函式在退出前先執行該註冊地函式。

a-3 :寫出下面程式的執行結果

[cpp]view plain

copy

#include 

#include 

#define loop 1000

int main()  

printf("%d/n", count);  

return 0;  

}  

解析:據說這是乙個很好的概率題。該題中暗含了乙個 1/4 圓和乙個正方形比較大小的問題。其中,rand_max 是隨機數中的最大值,也就是相當於最大半徑 r ;而 x 、 y 值則相當於橫縱軸的座標值,它們的平方和開根號就是原點到該點 (x, y) 的距離,當然這個距離可能大於 r 也有可能小於 r 。

通過上面的分析,該問題則可以蛻化為:隨機在正方形裡落 loop 個點,落在半徑裡面的點有多少個。鑑於1/4 圓面積是 (1/4)*π*r*r ,正方形面積是 r*r ,兩者之比為 (1/4)*π ,所以落點數為 loop*(1/4)*π 個。鑑於題意中 loop 為 1000 ,則可計算出大約為 785 個點。

然而,我在

linux ubuntu 2.6.24-22-generic

執行該程式得到的結果卻是

500左右,

why?

a-4 :寫出下列程式的執行結果:

[cpp]view plain

copy

#include 

int main()    

解析:首先 5 為 int 型,在 32 平台上會由編譯器分配 4 個位元組;當以 %f 方式輸出時,編譯器將從該值所在位址上讀出 8 個位元組。很顯然地,記憶體訪問越界,因此輸出結果不確定。同理以 %d 方式顯示浮點數 5.01 時,結果也將不確定。從實際測試來說,第乙個答案往往是 0.000000 ;第二個很可能是大數。

a-5 :寫出下面程式的執行結果:

[cpp]view plain

copy

#include 

using

namespace std;  

union  u;  

int main(

void)    

解析:該程式主要考察記憶體中資料如何儲存。在馮 · 諾依曼體系中,在記憶體中資料的低位位元組儲存在低位址上;而資料的位址則採用它的低位址來表示,具體情況如下所示:  

因此該結果將是: f0f1f2f3 , f3 。

b-1 :寫出下面程式的執行結果:

[cpp]view plain

copy

#include 

#include 

int main(

void)    

解析:這是乙個典型的溢位問題。首先陣列 s 被分配了 11 個字元(包含字串串尾的空字元),而陣列 d只被分配了 4 個字元;所以當使用 strcpy() 函式進行字串複製時,陣列 d 會溢位。由於陣列 s 和 d 都是自動變數,它們存在於 stack 中,而陣列 s 先被分配在高位址上,而陣列 d 則被分配在後續的低位址上,當陣列d 越界時,則會造成陣列 s 中的資料被覆蓋,原來的「 123456789 」 則被覆蓋為「 56789/ 0789 」 ,其中』/0』 代表字串尾的空字元。

因此,該輸出應該是 123456789 , 56789 。

c-1:按下面矩陣的輸出寫出相應的程式:

n=5:

1   2   9 10 25

4   3   8 11 24

5   6   7 12 23

16 15 14 13 22

17 18 19 20 21

n=6:

1   2   9 10 25 26

4   3   8 11 24 27

5   6   7 12 23 28

16 15 14 13 22 29

17 18 19 20 21 30

36 35 34 33 32 31

解析:這是網易有道的一道面試題。貌似在面試中這種型別的題目不少,之前在我的部落格中就有一篇關於 螺旋佇列

的解析。如果你仔細觀察上述輸出,就會發現從 1 開始按照大小會排列成蛇形,那麼我們姑且把該題目叫做蛇形佇列 的演算法設計。

如果你是第一次接觸這種型別的題目,可以看一下部落格中關於 螺旋佇列

的解析,這裡只寫出關鍵的部分。假定 1 值點所在座標為 (0, 0 ),橫向為 x 軸,以向右為正;縱向為 y 軸,以向下為正。對於任一點 (x, y),記 x 與 y 中的絕對值最大者為 a :

(1)       若 a 等於 x 的絕對值。當 a 為奇數時,輸出 a 2 +y+1 ;否則,輸出 (a+1) 2 -y 。

(2)       若 a 等於 y 的絕對值。當 a 為奇數時,輸出 (a+1) 2 -x ;否則,輸出 a 2 +x+1 。

c-2 :36 匹馬賽跑,跑道同時只能容許 6 匹馬。而且 36 匹馬速度不同,但是每次跑的速度恆定。問,跑多少次可以選出第一,第二,第三名。

解析:這同樣是網易有道的一道筆試題。在網上已經有不少解答,這裡總結一下各種方法:

( 1 ) 6 次。 36 匹馬,每 6 匹一組,對六次賽跑的結果分析,從而得出結論。這是最有爭議的辦法,但如果從出題者的角度看,這種方法顯然無法通過。

( 2 ) 11 次。 36 匹馬,第一組 6 匹馬賽完後,淘汰後三名;從剩下的 30 匹馬中任選 3 匹進行第二輪,如此迴圈 … … 1+30%3 = 11

( 3 ) 8 次。 36 匹馬,每 6 匹一組,賽完後取每組的第一名進行第七場賽跑,記錄該次比賽的前三名。繼而取第一名所在組的第

二、第三名,第二名所在組的第

一、第二名,第三名所在組的第

一、第二名進行第八場賽跑,得出前兩名。最終得到結論。

第三種方法最切合出題者的意圖。然而如果說裁判的記憶力很差,只能記住一場比賽的結果時,那麼顯然第三種方法便不是正解了;如果裁判可以記錄,那麼第一種辦法則成為最優解。所以,我認為這個題目本身有多種解答,應該就具體情況具體分析。

c-3:給定乙個字串 x ,求它最長字串 s ,使得 s=sr , sr 為 s 的反序,即如果 s=abc ,則 sr=cba 。比如: x=abccba ,則輸出 s=abc 。

解析:這是乙個典型的查詢回文的題目。下面是我自己編寫的乙個處理程式:

[cpp]

view plain

copy

#include 

#include 

int main(

void)  

}  if((i+max) > strlen(in))  

break;  

}  for(tp=p-max;tpprintf("%c",*tp);  

printf("/n");  

return 0;  

}  

趣味面試題

1.火柴棍式 程式設計師面試題 有時候,有些面試題是很是無厘頭,這不,又有乙個,還記得小時候玩的的 火柴棍遊戲 嗎,就是移動一根火柴棍改變乙個圖或字的遊戲。程式面試居然也可以這麼玩,看看下面這個火柴棍式的程式面試題吧。下面是乙個c程式,其想要輸出20個減號,不過,粗心的程式設計師把 寫錯了,你需要把...

趣味面試題第一組

第一組 1.燒一根不均勻的繩,從頭燒到尾總共需要1個小時。現在有若干條材質相同的繩子,問如何用燒繩的方法來計時乙個小時十五分鐘呢?2.你有一桶果凍,其中有黃色 綠色 紅色三種,閉上眼睛抓取同種顏色的兩個。抓取多少個就可以確定你肯定有兩個同一顏色的果凍?4.乙個岔路口分別通向誠實國和說謊國。來了兩個人...

面試題 之 趣味智力題

20 郵電局更換 號碼。不過,這個新的 號碼很不錯。有三個特點使新的 號碼 很好記 首先,原來的號碼和新換的號碼都是四個數字 其次,新號碼正好是原來號碼的4倍 再次,原來的號碼從後面倒著寫正好是新的號碼。新號碼究竟是多少?8712 21 有10箱罐頭,每箱20瓶,每瓶1000克。由於工作失誤,有一箱...