作者近期面試北京多家頭部公司(團購、手遊、端遊工作室),彙總高頻考點與實戰題目,涵蓋基礎語言、資料結構、網路程式設計、並發、資料庫、系統設計與軟素質。
要求:判斷字串是否為合法 IPv4(如 192.168.1.34),拒絕 192.168.1.34.45、192.0.01.34 (前導零)、192.168.1.341 (>255)、0.77.1.a4 (非數字)。
bool is_ipv4(const char *ips) {
if (!ips || !*ips) return false;
int seg_len = 0, total_len = 0, dots = 0, val = 0;
char c;
do {
c = *ips;
if ((c < '0' || c > '9') && c != '.') return false;
if (c >= '0' && c <= '9') {
val = val * 10 + (c - '0');
if (val > 255) return false; // > 255
if (seg_len > 0 && val < 10) return false; // 前導零: 01, 09
seg_len++;
}
if (c == '.' || !ips[1]) { // 遇到點或字串結尾
if (seg_len == 0) return false; // 空段: 192..168
val = 0;
seg_len = 0;
if (c == '.') dots++;
}
total_len++;
} while (*++ips && dots < 4 && seg_len <= 3 && total_len <= 15);
return dots == 3 && !*ips && seg_len <= 3 && total_len <= 15;
}
關鍵點:單次遍歷、狀態機邏輯、邊界條件全覆蓋、無庫函數依賴。
要求:輸入 n,輸出所有 n = a + b (a ≤ b, a,b > 0),如 3 → 1+2,不重複、不含多項拆分。
void print_sum(int n) {
for (int a = 1; a <= n/2; ++a)
printf("%d = %d + %d\n", n, a, n-a);
}
考點:邊界條件 (n/2)、簡單邏輯清晰表達、完整可執行程式結構。
要求:處理正負號、溢出檢測、非法字元、空指標。
int str_to_int(const char *s, int *out) {
if (!s || !*s || !out) return -1;
int sign = 1;
if (*s == '+' || *s == '-') sign = (*s++ == '-') ? -1 : 1;
long val = 0;
while (*s) {
if (*s < '0' || *s > '9') return -1;
val = val * 10 + (*s++ - '0');
if (sign == 1 && val > INT_MAX) return -2;
if (sign == -1 && -val < INT_MIN) return -2;
}
*out = (int)(sign * val);
return 0;
}
| 領域 | 必考核心 | 加分項 |
|---|---|---|
| C 基礎 | 指標/記憶體模型、UB 行為、const/volatile/restrict、結構體對齊 | C11/C17 新特性、編譯器屬性 |
| 資料結構 | 鏈表/樹/堆/哈希/圖、常見演算法複雜度 | 無鎖資料結構、持久化資料結構 |
| 網路程式設計 | TCP 狀態機、三次握手/四次揮手、I/O 多路複用、零拷貝 | QUIC、HTTP/2/3、eBPF |
| 並發 | pthread、鎖/條件變數/信號量、線程池、死鎖避免 | 無鎖程式設計、RCU、actor 模型 |
| Linux 系統 | 虛擬記憶體、檔案系統、信號、進程間通訊 | namespace/cgroup、內核模組 |
| 資料庫 | 事務 ACID、索引 (B+ 樹)、鎖/ MVCC、慢查詢優化 | 分散式事務、NewSQL |
| 系統設計 | 分層架構、快取策略、限流/熔斷、可觀測性 | 領域驅動設計、事件溯源 |