Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321
題目要求: Example2: x = -123, return -321
反轉一個整數,並維持其原本正負號。例如:
123 => 321思路:
-123 => -321
這題就是用標準的
- % 10 的方式從原數字取個位數
- *10 + xxx的方式,把結果數字往前推一位,然後加上剛剛取得的個位數
- 原數字 / 10退一位
三步驟來反轉整數。
這題的重點是特別注意反轉後會不會 overflow。
為了方便起見,我們是先把數字的正負號記起來,然後統一使用正整數來操作。正整數最大為 INT_MAX。要檢查做完乘法之後會不會 overflow,不能寫成:
if (a * 10 > INT_MAX) { cout << "Overflow!!! GG" << endl; }
因為當你作 a * 10這個動作時,有可能數字已經爆掉。這邊必須改寫成:
if (a > INT_MAX / 10) { cout << "Overflow!!! GG" << endl; }
就不會有報掉的疑慮。同理 if (a + num > INT_MAX) 必須改成 if (a > INT_MAX - num)。
另外一種思考方式是,我用 long long來裝 result, 因為 int是用 4 bytes表示,long long用 8 bytes表示,他可以裝的下 INT_MAX ~ LLONG_MAX這些數字,然後再拿 result來跟 INT_MAX相比,就知道有沒有 overflow。實作:
Time complexity is O(n)
沒有留言:
張貼留言