求一个整数的逆整数(Reverse Integer)

来源:互联网 发布:淘宝客佣金到账 编辑:程序博客网 时间:2024/06/07 23:34

leetCode中一道题。求一个整数的逆整数(就是将整数的各个位进行反序)。

Reverse digits of an integer.

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

正常情况下需要考虑的地方就是整数反序后可能会溢出。java中int型用四个字节存储,范围为 [-2^32,2^32-1),即是[-2147483648,2147483647)。同时在程序中用到%运算,需要注意取模运算和求余数运算的不同之处。 
摘自百度百科:计算模或者余数: r = a - c*b.     求模运算和求余运算在第一步不同: 取余运算在取c的值时,向0 方向舍入(fix()函数);而取模运算在计算c的值时,向负无穷方向舍入(floor()函数)。(java中%运算符指的是求余数,而余数是可正可负的,与潜意识中的认识不同。)
下面是leetcode中的答案,简直是精简完美到不能。

public int reverse(int x) {   int ret = 0;   while (x != 0) {      // handle overflow/underflow      if (Math.abs(ret) > 214748364) {            return 0;      }      ret = ret * 10 + x % 10;      x /= 10;   }   return ret;}

可能需要注释的地方就是在检查ret溢出的相关语句(if语句)。 程序在检测溢出的时候用到的阈值是214748364,而int的范围值是2147483648 , 比所用的阈值多了最后一位。 原因在于 我们检测ret是否溢出的时候应该用到一个先决条件就是x是正常int值,没有溢出。  因为x没有溢出,那么当x为十位数的时候(这时候ret才可能溢出),x的第一位肯定只会为1或者2,也就是说ret的最后一位只可能是1或者2。 而int范围阈值的最后一位为8,所以我们完全可以不考虑ret最后一位。


0 0