實現 void InvertStr(char *str),將 "abc" 變為 "cba"。
void InvertStr(char *str) {
if (!str) return;
char *left = str;
char *right = str + strlen(str) - 1;
while (left < right) {
char tmp = *left;
*left++ = *right;
*right-- = tmp;
}
}
關鍵點:
strlen 獲取長度,右指針指向最後有效字符(非 \0)left < right 條件避免重複交換中間字符輸入 unsigned char,返回二進制中 1 的個數。例:0b00000101 → 2。
unsigned char countBits_v1(unsigned char x) {
unsigned char cnt = 0;
for (int i = 0; i < 8; ++i) {
cnt += x & 1; // 檢查最低位
x >>= 1; // 右移
}
return cnt;
}
unsigned char countBits_v2(unsigned char x) {
unsigned char cnt = 0;
while (x) {
x &= (x - 1); // 消除最低位的 1
++cnt;
}
return cnt; // 循環次數 = 1 的個數
}
平均循環次數少,面試加分項。
// 256 字節預計算表
unsigned char bitCountTable[256];
void initBitCountTable() {
for (int i = 0; i < 256; ++i) {
bitCountTable[i] = (i & 1) + bitCountTable[i >> 1];
}
}
unsigned char countBits_v3(unsigned char x) {
return bitCountTable[x];
}
// 32 位版本
int popcount32(uint32_t x) {
x -= (x >> 1) & 0x55555555;
x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
x = (x + (x >> 4)) & 0x0F0F0F0F;
x += x >> 8;
x += x >> 16;
return x & 0x3F;
}
現代 CPU 有 POPCNT 指令,編譯器 -mpopcnt 可自動優化。
n & (n-1)、查表、並行加總POPCNT 指令、SIMD 加速兩道看似基礎的題目,實則涵蓋指針、位運算、查表優化、硬件指令等核心功底。面試中寫出 v1 為及格,主動優化到 v2/v3 並說明場景適用性為優秀,能討論 CPU 指令集優化為專家級。