第一週LeetCode算法題之二

題目名稱:Reverse Integer

題目難度:Easy

題目描述:Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321
Note:
The input is assumed to be a 32-bit signed integer. Your function should return 0 when the reversed integer overflows.

題目分析:
本題相對於上一道題目來講難度高了點。
首先反轉數字想到的便是先將數字的每一位分別取出來,然後按照相反的順序組合起來。
這一步並不難,分別取出數字的位值可以用取模法:先將數字對10取模,便得到了最低位的數字,然後再將數字除以10,這樣下次再對10取模就能得到倒數第二位的數字……如此重複下去,直到取出所有位的數字。將這些數字存儲起來。之後再通過相反的順序取出並組合成新的值便可初步得到結果。
本題的難點在於題目中的提示,提示說因爲使用的是32位有符號數的表示法,所以反轉過來的數字可能會超過32位的表示範圍,答題者需要考慮到這一點。
首先,32位有符號數的範圍是 -2147483648 到 2147483647。那末,如何判斷一個有符號數的反轉數是否超過了這個範圍呢?
博主第一個想到的方法是直接簡單粗暴的寫一個判斷,判斷結果是否超出了上述範圍:

if (result > 2147483647 || result < (-2147483648)) {
  return 0;
}

然而這種想法太天真,很明顯是行不通的。因爲result本身也是一個由32位表示的有符號數,他肯定是不會超過這個範圍的。
舉一個超過範圍的例子:

Input: 1534236469
Output: 1056389759
Expected: 0

那麼還有什麼比較巧妙的方法嗎?博主通過觀察注意到,反轉值超過範圍的測試數他們基本都有一個特點,那就是反轉值的每一位基本都與我們預期得到的數字不同。因爲反轉值已經超出了範圍,所以系統自動將它範圍化了,這種處理會導致在很多位上的數字跟我們預期的不一樣,而且一樣的可能性只有10%。我們可以利用這一點,寫出新的檢測:將結果的某一位跟與之對應的期望數相比較,如果不一樣,則有90%的把握確定它超過了表示範圍。如果想提高這個正確比例,只需增加比較的位數即可。
所以最後AC的代碼如下:

class Solution {
public:
    int reverse(int x) {
        queue<int> q;
        int tx = x;
        while (tx != 0) {
          int temp = tx % 10;
          q.push(temp);
          tx /= 10;
        }
        int result = 0;
        int store;
        while (!q.empty()) {
          result = result*10 + q.front();
          store = q.front();
          q.pop();
        }
        if (store != result%10)
          return 0;
        return result;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章