天天看點

《每日一套題·提升你我能力》· 第三篇【面試官問的這個問題,你知道怎麼回複嗎?】

大家好,我是安然無虞。

文章目錄

  • 每篇前言
  • ​​一、選擇填空題​​
  • ​​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,這就是證明過程,不過其實還有一種特别好的方法,給個提示:求連結清單的相交問題。如果你有思路的話歡迎在評論區留下自己的想法哦,這個方法會在下篇文章中給出哦。

三、遇見安然遇見你,不負代碼不負卿。

今天就到這裡咯,歡迎大家在評論區留下另外一種方法的解題思路哦,最後,制作不易,求老鐵的三連鴨。

繼續閱讀