思路:取绝对值,反转,并判断反转的结果是否大于最大整数,需要注意的细节:判断时需要这样:result > (Integer.MAX_VALUE - v) / 10 否则result * 10 + v% 10 > Integer.MAX_VALUE左边会直接出现溢出。最后加上符号位。
1 public int reverse(int x) { 2 if(x==Integer.MIN_VALUE){ 3 return 0; 4 } 5 //然后取绝对值,判断绝对值不大于Integer.MAX_VALUDE,不能直接用result拼接判断,否则会溢出。 6 //例如result * 10 + v% 10 > Integer.MAX_VALUE ,result为反转结果,v为最后一位,也是上一个原始数截取的余数. 7 //左边很可能就会溢出,因此需要反转来判断 :result > (Integer.MAX_VALUE - v) / 10 8 int absx=Math.abs(x); 9 int result=0; 10 while(absx!=0){ 11 int v=absx%10; //余数,作为反转后的连接位 12 if(result>(Integer.MAX_VALUE-v)/10){ 13 //溢出 14 return 0; 15 } 16 //如果不溢出,则连接下一位 17 result=(result*10+v); 18 absx/=10; //原始数去掉最后一位,重复上述截取连接步骤 19 } 20 //如果原始数为负数,则返回负数,否则直接返回 21 return x>0?result:-result; 22 23 }