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; } }