題目
給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。
示例 1:
輸入: 123
輸出: 321
示例 2:
輸入: -123
輸出: -321
示例 3:
輸入: 120
輸出: 21
注意:
假設我們的環境只能存儲得下 32 位的有符號整數,則其數值範圍爲 [−231, 231 − 1]。請根據這個假設,如果反轉後整數溢出那麼就返回 0。
開始思考
我開始的想法是,利用%=和/=來分解數位,然後填入數組,然後輸出,但是leetcode是函數形式最後是需要將結果,以return int的形式返回去,於是我就遇到了,不知怎麼判斷數組空間有幾位數字的問題以及,如果末尾有0,存入數組後我應該如何解決呢。最後在看了官方題解的後:
它是這樣的:分解數位的思路是對的,但不用把它單獨存入數組裏這樣,在分解的過程就把它在乘起來,不用二次計算。
解題
class Solution {
public:
int reverse(int x) {
int rev = 0;
while (x != 0) {
int pop = x % 10;
x /= 10;
if (rev > INT_MAX/10 || (rev == INT_MAX / 10 && pop > 7)) return 0;
if (rev < INT_MIN/10 || (rev == INT_MIN / 10 && pop < -8)) return 0;
rev = rev * 10 + pop;//這步可能會溢出,所以在這之前一定一定要檢查,
}
return rev;
}
};
複雜度分析
- 時間複雜度:O(log(x)),x 中大約有log 10(x) 位數字。
- 空間複雜度:O(1)。
反思記憶:
- int的範圍是 -2147483648~~ 2147483647
所以通過這個 pop>7 或 pop<-8 來判斷溢出。 - INT_MAX是一個系統變量,自己還一開始打算傻乎乎的算出來2的31次方,打算用這個值。在#include<limits.h>頭文件裏面。
- 由於字符串轉換的效率較低且使用較多庫函數,所以我在上面的初始思路可能系統效率並不好