1. 程式人生 > >【LeetCode刷題記錄】Reverse Integer

【LeetCode刷題記錄】Reverse Integer

題目

Reverse digits of an integer.

Example1: x = 123, return 321
Example2: x = -123, return -321

Here are some good questions to ask before coding. Bonus points for you if you have already thought through this!

If the integer’s last digit is 0, what should the output be? ie, cases such as 10, 100.

Did you notice that the reversed integer might overflow? Assume the input is a 32-bit integer, then the reverse of 1000000003 overflows. How should you handle such cases?

解答

題意很明確,把一個十進位制數逆序表示。
首先,只考慮如何實現逆序。和Reverse Bits相似,從低位開始。x%10得到最低位,x/10相當於右移1位,然後在處理下一位之前,對已經產生的結果乘以10,不斷把低位往高位移動。
然後,就掉進坑裡面了。顯然,對於32位的int來說,表示範圍為[-2^31, 2^31](即-2147483648~2147483647)。最明顯的特例是當x=2147483647時,逆序之後的數是超出int32的表示範圍的。所以,需要進行判斷。
自己沒想出來,在討論區裡找到一個好方法:使用long long型別儲存逆序之後的中間結果,它可以表示32位int逆序之後的所有數;然後再判斷其大小有沒有超出32位int的表示範圍。
通過這題,又一次深刻地認識到資料型別的妙用。AC程式碼如下:

int reverse(int x) {
    if (x == 0)
        return 0;
    long long ret = 0;

    while (x != 0) {
        ret = ret*10;
        ret += x%10;
        x = x/10;
    }

    return (ret > INT_MAX || ret < INT_MIN) ? 0 : ret;
}