LeetCode每日一題:整數反轉(No.7)

胖宅老鼠發表於2019-03-27

題目:整數反轉


給出一個 32 位的有符號整數,你需要將這個整數中每位上的數字進行反轉。
複製程式碼

示例:


輸入: 123
輸出: 321

輸入: -123
輸出: -321

輸入: 120
輸出: 21
複製程式碼

思考:


這道題整數反轉的可以參考之前那篇迴文數的方法。

將x對10 求餘,然後在除以10,再將結果對10求餘,再次除以10。一直到結果為0為止。
接著將每次求得的餘數按位數相加,得到的結果就是將原來的x翻轉過來的數。
例如:12345
12321 對10求餘:餘數為5   除以10:結果為1234
 1232 對10求餘:餘數為4   除以10:結果為123
  123 對10求餘:餘數為3   除以10:結果為12
   12 對10求餘:餘數為2   除以10:結果為1
    1 對10求餘:餘數為1   除以10:結果為0
至此為止,我們發現將餘數加起來就是54321,就是將原數12345翻轉後的結果。 
複製程式碼

注意:要判斷反轉後的數是否會超過32位整形最大最小值!

public final class Integer extends Number implements Comparable<Integer> {
/**
 * A constant holding the minimum value an {@code int} can
 * have, -2<sup>31</sup>.
 */
@Native public static final int   MIN_VALUE = 0x80000000;//十進位制為-2147483648

/**
 * A constant holding the maximum value an {@code int} can
 * have, 2<sup>31</sup>-1.
 */
@Native public static final int   MAX_VALUE = 0x7fffffff;//十進位制為2147483647-1
複製程式碼

實現:


class Solution {
public int reverse(int x) {
    int result = 0;
    while (x != 0) {
        int remainder  = x % 10;
        x /= 10;
        //乘以10後時候會大於Integer.MAX_VALUE,所以乘之前先和Integer.MAX_VALUE比較
        //如果相等最後一位餘數不能大於7
        if (result > Integer.MAX_VALUE/10 || (result == Integer.MAX_VALUE / 10 && remainder  > 7)) 
            return 0;
        //乘以10後時候會小於Integer.MIN_VALUE,所以乘之前先和Integer.MIN_VALUE比較
        //如果相等最後一位餘數不能小於-8
        if (result < Integer.MIN_VALUE/10 || (result == Integer.MIN_VALUE / 10 && remainder  < -8))
            return 0;
        result = result * 10 + remainder ;
    }
    return result;
}
}
複製程式碼

相關文章