首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

經典 IT 面試題精選:有號無號比較陷阱、邏輯推理與系統設計思維

     編輯:關於C語言

題目一:sizeof 與有號無號比較陷阱

#include 
#define TOTAL_ELEMENTS (sizeof(array) / sizeof(array[0]))
int array[] = {23,34,12,17,204,99,16};

int main() {
    int d;
    for (d = -1; d <= (TOTAL_ELEMENTS - 2); d++)
        printf("%d\n", array[d+1]);
    return 0;
}

現象

迴圈完全不執行,無輸出。

根因分析

  1. sizeof 回傳 size_t(無號整數)。
  2. TOTAL_ELEMENTS 為 7(size_t)。
  3. TOTAL_ELEMENTS - 2 為 5(size_t)。
  4. 比較 d <= (size_t)5 時,d(int)隱式轉換為 size_t。
  5. d = -1 轉為無號數變成 UINT_MAX(4294967295),遠大於 5,條件判斷為假,迴圈零次執行。

修正方案

// 方案 1:將迴圈變數改為無號數
for (size_t d = 0; d < TOTAL_ELEMENTS - 1; ++d)

// 方案 2:強制轉型比較值
for (int d = -1; d <= (int)(TOTAL_ELEMENTS - 2); ++d)

// 方案 3:避免混合比較,改用 < 而非 <=
for (int d = 0; d < (int)TOTAL_ELEMENTS - 1; ++d)

核心原則

「盡量避免有號與無號整數直接比較;迴圈索引優先使用 size_t 或 int 但保持一致;邊界條件用 < 而非 <=。」

題目二:賣買獲利邏輯陷阱

情境:某人 8 元買入,9 元賣出,10 元買入,11 元賣出。總獲利多少?

三種視角

  1. 現金流視角:-8 +9 -10 +11 = +2 元(最直觀、正確)。
  2. 總成本/總收入視角:總付出 18,總收入 20,獲利 2 元。
  3. 機會成本視角:若一開始就拿 11 元賣出,可賺 3 元;實際只賺 2 元,虧損 1 元機會成本。(屬於經濟學分析,非會計獲利)。

面試重點:能否清晰定義「獲利」定義,並說明現金流為準。

題目三:雨中奔跑 vs 走路誰淋濕更多

模型假設:

  • 人體簡化為長方體(寬 50cm、厚 10cm、高 170cm)
  • 雨滴均勻垂直下落,無風
  • 雨強度:1 滴/秒/cm²,滴重 0.01g

結論:

  • 頂部受雨量 = 橫截面積 × 時間 = 固定值(與速度無關)
  • 正面受雨量 = 正面面積 × 路程 = 固定值(與速度無關)
  • 總受雨量恆定,但奔跑時間短,體感不適感較低。

延伸:有風時,傾斜身體可減少正面受雨,此時奔跑確實能減少總雨量。

題目四:瘋狗槍殺邏輯推理(藍眼睛謎題變體)

規則:N 條狗,其中 K 條生病。主人每天觀察其他狗,若確定自己狗生病則當晚槍殺。已知 K > 0 且 K < N。

歸納法解:

  • K=1:該主人見無其他病狗 → 立即確定 → 第 1 晚槍殺。
  • K=2:每位病狗主人見 1 隻病狗 → 若 K=1 應第 1 晚槍殺 → 第 2 天見未槍殺 → 確定 K=2 → 第 2 晚槍殺。
  • K=N:第 N 晚集體槍殺。

關鍵:公共知識(大家都知道大家都知道...)觸發遞歸推理鏈。

題目五:立方體染色計數

20 面體(實為正二十面體?題目存疑),3 種顏色,每面一色,求本質不同染色數。
若為立方體(6 面),波利亞計數定理:
(3^6 + 3*3^4 + 12*3^3 + 8*3^2) / 24 = 57 種。
原題 20 面體需用二十面體旋轉群(60 階)計算,此處不展開。

題目六:鑽石選擇最優策略(秘書問題/最佳停止理論)

10 層樓,每層 1 顆鑽石,只能觀察不可回頭,求拿到最大鑽石機率最大化策略。
最優解:前 n/e ≈ 3.68 層(取 3 或 4 層)僅觀察記錄最大值,其後遇到超過該最大值的立即拿取。
機率約 1/e ≈ 36.8%,為理論上限。無法保證 100% 拿到最大。

面試應對心法

  1. 釐清假設:先確認模型邊界(如有號/無號、雨模型參數)。
  2. 分層回答:直觀答案 → 數學推導 → 邊界情況 → 工程權衡。
  3. 承認不會:遇到不熟悉領域(如二十面體群論),誠實說明並展示如何查找/建模。
  4. 代碼驗證:能現場寫出驗證程式(如有號無號比較)極具加分。

總結

經典面試題不僅考察知識點,更考察建模能力、邊界思維、溝通表達。將每道題轉化為「模型→假設→推導→驗證→總結」的標準化解題流程,配合持續補充計算機科學基礎(離散數學、概率論、計算機體系結構),方能在面試中游刃有餘。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved