isdigitresult > INT_MAX/10 || (result==INT_MAX/10 && digit > INT_MAX%10)endptr 輸出解析終止位置)
int myatoi(const char* str) {
while (*str == ' ' || *str == '\t') str++;
int sign = 1;
if (*str == '-') { sign = -1; str++; }
else if (*str == '+') str++;
long long result = 0; // 用長長整型暫存防溢出
while (*str >= '0' && *str <= '9') {
result = result * 10 + (*str - '0');
if (sign == 1 && result > INT_MAX) return INT_MAX;
if (sign == -1 && -result < INT_MIN) return INT_MIN;
str++;
}
return (int)(sign * result);
}
INT_MIN 絕對值溢出(用 unsigned 或特判)/=10 縮減,字符逆序存入臨時數組'-',最後整體逆序輸出到目標緩衝區單次掃描,維護 curChar, curLen, maxChar, maxLen,字符變化時比較更新最大值。O(n) 時間,O(1) 空間。
動態規劃 dp[i][j] 表示以 s1[i-1]、s2[j-1] 結尾的最長公共後綴長度。
if (s1[i-1]==s2[j-1]) dp[i][j]=dp[i-1][j-1]+1; else dp[i][j]=0;
記錄最大值位置回溯提取子串。O(mn) 時間,可優化至 O(min(m,n)) 空間。
char* strstr(char* haystack, char* needle) {
if (!*needle) return haystack;
for (; *haystack; haystack++) {
char *h = haystack, *n = needle;
while (*h && *n && *h == *n) { h++; n++; }
if (!*n) return haystack;
}
return NULL;
}
next[i] = 模式串 [0..i] 的最長真前綴同時為後綴的長度。匹配失敗時 j = next[j-1] 避免主串回溯。O(n+m)。
利用 bool seen[256] = {false}(ASCII)或 unordered_set,遍歷原串,未見過則加入結果並標記。O(n) 時間,O(字符集) 空間。
C++ next_permutation 算法:
1. 從右向左找第一個 a[i] < a[i+1]
2. 從右向左找第一個 a[j] > a[i]
3. swap(i,j),reverse(i+1, end)
下一個排列生成器模式,避免遞歸棧溢出。
雙指針 left=0, right=len-1,swap(s[left++], s[right--]) 直到相遇。原地 O(n)。
兩遍掃描:第一遍統計頻次 cnt[256],第二遍找第一個 cnt[c]==1 的字符。O(n)。
棧思想:遍歷字符,棧頂相同則彈出(抵消),不同則壓入。最終棧內即為結果。O(n) 時間,O(n) 空間。
中心擴展法:枚舉 2n-1 個中心(字符中心、字符間隙),向兩側擴展判斷。發現任意長度≥2 的回文即返回 true。O(n²) 最壞,平均較快。
Manacher 算法 O(n):預處理插入 # 統一奇偶長度,維護 RL[i](以 i 為中心的回文半徑)與 MaxRight, pos。
或 DP O(n²):dp[i][j] = (s[i]==s[j]) && (j-i<2 || dp[i+1][j-1])。
s2 是否為 s1 循環移位的子串 ⇔ s2 是 s1+s1 的子串。直接 strstr(s1+s1, s2)。O(n)。
char* strcpy(char* dest, const char* src) {
char* ret = dest;
while ((*dest++ = *src++)) ; // 賦值同時檢查 '\0'
return ret;
}
// 注意:src 與 dest 重疊時行為未定義,需用 memmove
UTF-8 中文佔 3 字節(首字節高位 1110xxxx 即 ≥0xE0),ASCII 英文字符佔 1 字節(高位 0)。遍歷字節流,根據首字節高位判斷字符寬度,只複製中文字節。O(n)。
同「二」,但統計任意長度子串需後綴數組/後綴自動機,O(n) 構建後綴自動機 可解決廣義最長重復子串問題。
| 題目 | 核心考點 | 加分回答 |
|---|---|---|
| atoi | 邊界、溢出、錯誤處理 | 引用 glibc 源碼邏輯,說明 endptr、errno 語義 |
| KMP | next 數組構建 | 手寫 getNext,解釋「前綴=後綴」幾何意義 |
| Manacher | 線性回文 | 畫圖演示 RL、MaxRight 更新過程 |
| 循環移位 | 數學轉化 | 證明 s2 in s1+s1 ⇔ s2 是 s1 循環移位子串 |