大家好,我是安然無虞。
文章目錄
- 每篇前言
- 一、選擇填空題
- 1.易錯·操作符優先級問題
- 舉一反三
- 2.整形提升問題
- 3.易錯·無符号數問題
- 二、程式設計設計題
- 面試題:環形連結清單·I
- 解題思路:面試官常問的兩個問題
- 面試題:環形連結清單·II
- 解題思路:面試官問的這個問題你知道嗎
- 三、遇見安然遇見你,不負代碼不負卿。
每篇前言
作者:安然無虞
作者請求:由于部落客水準有限,難免會有錯誤和不準之處,我也非常渴望知道這些錯誤,懇請鐵汁批評斧正。
一、選擇填空題
1.易錯·操作符優先級問題
題目描述:int i = 10; int j = 20; int k = 3; k *= i + j;
問:k的值是多少?
當時這是一道選擇題,有一個選項是50,我傻傻的選了它,其實結果是90,這也就涉及到運算符優先級的問題。
*=、/=、%=…這些優先級都是比較低的,但是需要強調的是,優先級不要背,大緻知道順序就行了,是以要多看幾遍,當然,如果記憶力好并且時間多的話,背也沒事。
為了友善大家記憶,給出如下圖檔,來自:愛學習的諸葛大力舉一反三
題目如下:int fun(int a) { a ^= (1 << 5) - 1; return a; }
輸入:a = 21
輸出:a = 10
這裡就不解釋咯,很簡單。
2.整形提升問題
題目描述: 解題思路:
3.易錯·無符号數問題
題目描述:解題思路:
其實在注釋裡就給出了,無符号char,有8位,且全部是數值位,沒有符号位,是以其範圍是0~255。
這裡能看出什麼呢,當我們在使用有符号數的時候要特别注意,尤其是有符号數和無符号數互相轉換問題更需要格外小心。
二、程式設計設計題
面試題:環形連結清單·I
題目描述: 示例:代碼執行:
本題代碼比較簡單,難的是分析過程,大廠考察的也是我們分析的過程,是以這裡就直接給出代碼了,後面再仔細分析為何這樣寫代碼。
完整代碼:bool hasCycle(struct ListNode *head) { struct ListNode* slow = head; struct ListNode* fast = head; while(fast && fast->next) { slow = slow->next; fast = fast->next->next; if(slow == fast) return true; } return false; }
解題思路:面試官常問的兩個問題
問題一:請證明slow和fast一定會在環裡相遇嗎,有沒有可能追不上?
解答:
是以,當slow走一步,fast走兩步時,是一定能追上的。
問題二:slow走一步,fast走三步,這個方法可行嗎?slow走一步,fast走四步,這個方法可行嗎?。。。請證明
解答:
面試官如果問我們上面的問題,就這樣回答即可。
面試題:環形連結清單·II
題目描述: 示例:代碼執行:
本題跟上一題一樣,代碼很簡單,難的是分析的過程,過程整明白了,代碼自然就出來了。
完整代碼:struct ListNode *detectCycle(struct ListNode *head) { struct ListNode* slow = head; struct ListNode* fast = head; while(fast && fast->next) { slow = slow->next; fast = fast->next->next; if(slow == fast) { struct ListNode* meet = slow; while(meet != head) { meet = meet->next; head = head->next; } return meet; } } return NULL; }
解題思路:面試官問的這個問題你知道嗎
問題:怎麼求對外連結表的入口點?
解答:
注意fast走的路程不是L+C+X fast走的路程是slow的兩倍 OK,這就是證明過程,不過其實還有一種特别好的方法,給個提示:求連結清單的相交問題。如果你有思路的話歡迎在評論區留下自己的想法哦,這個方法會在下篇文章中給出哦。
三、遇見安然遇見你,不負代碼不負卿。
今天就到這裡咯,歡迎大家在評論區留下另外一種方法的解題思路哦,最後,制作不易,求老鐵的三連鴨。