定義函數 reverse(number),輸入整數,返回其數字逆序後的整數。例:reverse(12345) → 54321。
| 方法 | 核心邏輯 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|---|
| 數學累積法 | 反覆取尾數 n%10,結果 rev = rev*10 + n%10 | 無額外空間、效能最佳、原生整數運算 | 需處理溢位、負數、尾端零 | 通用、嵌入式、高效能要求 |
| 字串轉換法 | sprintf → 反轉字串 → strtol/atoi | 直觀、易處理負號、前導零自然去除 | 需緩衝區、函數呼叫開銷、非標準 C 風格 | 快速原型、教學演示 |
| 遞迴法 | reverse(n) = n%10 * 10^digits + reverse(n/10) | 程式碼簡潔、展示遞迴思維 | 堆疊深度受限、效能差、尾端零處理繁瑣 | 教學、面試展示 |
#include <stdio.h>
#include <limits.h> // INT_MAX, INT_MIN
// 逆序整數,處理溢位返回 0(LeetCode 7 風格)
int reverse(int n) {
int rev = 0;
while (n != 0) {
int digit = n % 10;
n /= 10;
// 溢位檢查:rev * 10 + digit 是否超出 int 範圍
if (rev > INT_MAX / 10 || (rev == INT_MAX / 10 && digit > 7)) return 0;
if (rev < INT_MIN / 10 || (rev == INT_MIN / 10 && digit < -8)) return 0;
rev = rev * 10 + digit;
}
return rev;
}
// 簡化版:假設輸入不會導致溢位(教學常用)
int reverse_simple(int n) {
int rev = 0;
while (n != 0) {
rev = rev * 10 + n % 10;
n /= 10;
}
return rev;
}
int main() {
int test_cases[] = {12345, -123, 120, 0, 1534236469}; // 最後一個會溢位
int n = sizeof(test_cases) / sizeof(test_cases[0]);
for (int i = 0; i < n; ++i) {
int input = test_cases[i];
int result = reverse(input);
printf("reverse(%d) = %d\n", input, result);
}
return 0;
}
reverse(12345) = 54321
reverse(-123) = -321
reverse(120) = 21
reverse(0) = 0
reverse(1534236469) = 0 // 溢位保護觸發
C 語言 % 運算結果符號與被除數相同:-123 % 10 = -3,-123 / 10 = -12(向零截斷)。上述迴圈自然支援負數,無需額外判斷。
120 → 0*10+0=0 → 0*10+2=2 → 2*10+1=21,前導零不會出現在整數表示中。
// 下一步 rev = rev * 10 + digit
// 若 rev > INT_MAX/10,乘 10 必溢位
// 若 rev == INT_MAX/10 且 digit > 7(INT_MAX 末位為 7),加 digit 溢位
// INT_MIN 同理,末位為 -8
這是 LeetCode 7「整數反轉」標準解法核心。
#include <string.h>
#include <stdlib.h>
int reverse_string_method(int n) {
char buf[20]; // 足夠容納 32 位整數含負號
sprintf(buf, "%d", n);
// 反轉字串(保留負號在最前)
int len = strlen(buf);
int start = (buf[0] == '-') ? 1 : 0;
for (int i = start, j = len - 1; i < j; ++i, --j) {
char tmp = buf[i];
buf[i] = buf[j];
buf[j] = tmp;
}
return atoi(buf); // 自動處理前導零、溢位行為未定義
}
| 輸入 | 輸出 | 說明 |
|---|---|---|
| 12345 | 54321 | 正常正數 |
| -12345 | -54321 | 負數,負號保持 |
| 1200 | 21 | 尾端零去除 |
| 0 | 0 | 邊界值 |
| 2147483647 (INT_MAX) | 0 | 溢位保護 |
| -2147483648 (INT_MIN) | 0 | 溢位保護 |
| 1000000003 | 3000000001 | 含零中間位 |
long long? 同邏輯,換 long long、LLONG_MAX/MIN。整數逆序是 模 10 取餘 + 累積乘 10 的經典模式。掌握 負數語意、尾端零、溢位檢查 三大細節,即能寫出生產級、面試級的 reverse 函數。