1 題目
Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321
2 分析
本題的解決主要依靠存在的數學關係:令
num % 10
表示num 的最後一位數字num / 10
表示num 去掉最後一位數字的值
根據上面的規律,可以把給定的數字逐位的進行上述運算, 求出 reverse number, 僞代碼如下:
- 初始化
res = 0
,表示要求的數值 - 初始化
sign = 1
, 表示給定的數字的正負,如果爲負,sign = -1
- 執行以下循環,循環的終止條件是
num = 0
,num
表示題目給定的數字的絕對值:
- 判斷res是否溢出,判斷方法爲
INT_MAX / 10 < res || (INT_MAX - num % 10) < res * 10
,其中INT_MAX
表示32位有符號整數的最大值,前一個條件判斷res*10
是否溢出, 後一個條件判斷res*10 + num%10
是否溢出:
- 如果是,則終止循環,返回0
- 如果否,則繼續循環計算
res = res * 10 + num % 10
num = num / 10
- 判斷res是否溢出,判斷方法爲
將sign * num
作爲返回值返回
算法的時間複雜度爲
3 代碼[1]
class Solution {
public:
int reverse(int x) {
int sign = x < 0 ? -1 : 1;
x = abs(x);
int res = 0;
while (x > 0) {
if (INT_MAX / 10 < res || (INT_MAX - x % 10) < res * 10) {
return 0;
}
res = res * 10 + x % 10;
x /= 10;
}
return sign * res;
}
};
[1]代碼來源:https://discuss.leetcode.com/topic/6104/my-accepted-15-lines-of-code-for-java/3