1、怎麼判斷鏈表裡有沒有環?
這個題目網上,書上都有答案。設定兩個指標,剛開始都指向鏈表的頭部,然後一個指標一次跑一步,另一個指標一次跑兩步,每移動一次就判斷他們是不是相等,如果相當,則鏈表中有環,並且交點就在現在兩個指標所指的位置。
但是如果事先沒有看到這個解答,在面試官面前能不能回答回來呢?
當然此題也可以用一個指標,再用一個足夠大的數組把指標所遍曆的結點的地址都儲存起來,並且指標每移動一步就在數組中尋找是否有和指標當前儲存的地址相等的值。如果數組中存在一個地址和指標當前儲存的地址相等,那麼結點之前已經遍曆過了,指標所指向的當前結點即為鏈表交叉的地方。
2、一個單向鏈表,遍曆一次且最多隻能遍曆一次,要找出倒數第N個的結點。
定義兩個指標,當其中一個指標向後移動N個結點後,第二個指標才開始向後移動。當第一個指標到達鏈表的末尾時,第二個指標就指向了倒數第N個結點了。
3、1條直線把平面分成2個地區,2條直線把平面分成4個地區,3條直線把平面分成7個地區,這樣依次每加一條直線都把平面分成最多的地區。問加入第2000條直線後,平面被分成了多少個地區?
這個題目也是個很經典的題目,有些書也有解答。不過看到這種題目,第一反應就是:肯定是有規律的,不然根本無法求解的。怎麼找規律呢?那肯定是先從最邊界(特殊)的情況開始研究,然後推廣到一般的情況去。也就是把1條直線,2條直線,3條直線把平面都分成了多少個地區都找出來,然後推出規律,並驗證。
這個題目,確實是要從最簡單的情況開始分析。通過細心的觀察,你可以發現,每加入一條直線,都會把原來的已經被切開的平面再切成2份,一份所包含的地區數就是加入直線前的地區數,另一份所包含的地區數就是就是原來已有的直線數再加一,即加入第幾條直線,就會增加幾個地區。第2000條直線也就會增加2000個地區。
4、給定一個正整數,寫一個程式判斷把它轉換為2進位數後,2進位數裡有多少個1。要求效率儘可能的高。
這題如果按照最常規的方法來做的話,比把一個數轉化為2進位數還要簡單。但是聽說能用位元運算的話,效率更高。研究了一下,代碼如下:
[csharp]
view plaincopy
- #include <iostream></iostream>
- using namespace std;
-
- int main()
- {
- int n;
- int cnt = 0;
- while (cin >> n) { // n為正整數。
- while (n) {
- if (n & 1)
- ++cnt;
- n = n >> 1;
- }
- cout << cnt << endl;
- cnt = 0;
- }
-
- return 0;
- }