2015年12月16日 星期三

[LC7] Reverse Integer

Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321
題目要求: 
反轉一個整數,並維持其原本正負號。例如:
 123  =>   321
-123  =>  -321
 思路:
這題就是用標準的 
  1. % 10 的方式從原數字取個位數
  2. *10 + xxx的方式,把結果數字往前推一位,然後加上剛剛取得的個位數
  3. 原數字 / 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)

沒有留言:

張貼留言