反转一个32位有符号整数。如果反转后的结果超过整型范围,返回0。不允许使用64位整数。
最容易理解的方法是:整数转字符串,反转后再转回整数。其中需要处理一些细节,1是对负数的处理,2是越界的处理。
public int reverse(int x) { String xString = Integer.toString(x); String string = xString; int flag = 1; //正负号 //负号处理 if (x<0){ flag = -1; string = xString.substring(1); //去掉负号 } //越界处理 try{ return Integer.valueOf(new StringBuilder(string).reverse().toString())*flag; }catch (Exception e){ return 0; } }
官方提供的最快的方法:
重复“弹出” x 的最后一位数字,并将它“推入”到 rev 的后面。需要注意的细节是整数溢出(rev*10+pop)。
需要在此操作前检查是否溢出。先考虑正数时,如果溢出,则rev*10 +pop > Integer.MAX_VALUE
解得:rev>Integer.MAX_VALUE/10
或 rev == Integer.MAX_VALUE/10 && pop> Integer.MAX_VALUE% 10
public int reverse(int x) { int rev = 0; while (x != 0) { int pop = x % 10; x /= 10; if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > Integer.MAX_VALUE%10)) return 0; if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < Integer.MIN_VALUE%10)) return 0; rev = rev * 10 + pop; } return rev; }
//Integer.MAX_VALUE%10 的值 是7,Integer.MIN_VALUE%10 的值是-8,官方题解中直接用了7和-8.