Idiot-maker

  :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

https://oj.leetcode.com/problems/reverse-integer/

Reverse digits of an integer.

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

public class Solution {
    public int reverse(int x) {
        int result = 0;
        int minus = 0;
        int MAX_MIN_VALUE = Integer.MAX_VALUE;
        
        if(x < 0){
            //x = -x;
            minus = 1;
            MAX_MIN_VALUE = Integer.MIN_VALUE;
        }

        do{
            if( (minus == 0 && result > MAX_MIN_VALUE / 10) || (minus == 1 && result < MAX_MIN_VALUE / 10)){
                return 0;
            }
            int mod = x % 10;
            if((minus ==  0 && result == MAX_MIN_VALUE / 10 && mod > MAX_MIN_VALUE % 10) 
            || (minus == 1 && result == MAX_MIN_VALUE / 10 && mod < MAX_MIN_VALUE % 10)){
                return 0;
            }
            result = result * 10 + mod;
        }while( (x = x/10) != 0);
        //if(minus == 1){
        //    result = -result;
        //}
        return result;
    }
}

解题思路:

对输入数字x不断除以10,取模(余数),同时将整除的结果赋予x(其实就是将最后一位去掉),直到整除的结果为0(X已经为个位数)。同时用变量result记录模,每一步将模×10+新的模,完成反转。

注意点:

1. 对负数取模,仍为负数,整除结果也是同样,所以可以考虑不要对正负数分开处理。

2. 数字过大或过小溢出问题。Integer.MAX_VALUE == 2147483647; Integer.MIN_VALUE == -2147483648。所以这时正负数分开处理就不尽合理了。

3. 一个数溢出。有两种可能,乘以10之前就已经大于或小于边界值(Integer.MAX_VALUE / 10)。或者此时等于Integer.MAX_VALUE / 10,但是最后一位大于Integer.MAX_VALUE / 10的最后一位了。但是,对于本情况无需考虑等于的情况,因为倘若最后一位>7或者>8,在乘以10之前肯定就大于Integer.MAX_VALUE / 10了。

4. 一个tricky的方法:可以考虑将result定义为long,直接判断是不是>Integer.MAX_VALUE或者小于。

// 2018/06/21

class Solution {
    public int reverse(int x) {
        int result = 0;
        while (x != 0) {
            int tail = x % 10;
            int cur = result * 10 + tail;
            if ((cur - tail) / 10 != result) {
                return 0;
            }
            result = cur;
            x = x / 10;
        }
        return result;
    }
}

 

posted on 2015-01-13 11:17  NickyYe  阅读(155)  评论(0编辑  收藏  举报