题目链接:https://leetcode.com/problems/reverse-integer/description/
题目大意:与190题类似,只是这题是反转十进制数值,在有符号整型范围内,如果得到的结果超过了整型范围,即溢出,则返回0。
法一:暴力解,将整型数转为字符串,再将字符串转为字符数组,将字符数组反转,再将字符数组转为字符串,最后按照正负,将字符串转为int返回。代码如下(耗时50ms):
1 public int reverse(int x) { 2 boolean mark = false; 3 if(x < 0) { 4 mark = true; 5 x = -x; 6 } 7 //转为字符串做 8 String s = Integer.toString(x); 9 char[] rs = s.toCharArray(); 10 int length = rs.length - 1; 11 //字符串反转 12 for(int i = 0; i < length; i++, length--) { 13 rs[i] ^= rs[length]; 14 rs[length] ^= rs[i]; 15 rs[i] ^= rs[length]; 16 } 17 s = String.copyValueOf(rs); 18 //将字符串转为数值 19 if(mark == true) {//负数 20 if(s.length() < 10) { 21 return -Integer.parseInt(s); 22 } 23 else if(s.length() > 10) { 24 return 0; 25 } 26 else { 27 //x.compareTo(y),如果x<y,返回数值<0;如果x>y,返回数值>0 28 if("2147483648".compareTo(s) < 0) { 29 return 0; 30 } 31 else { 32 return -Integer.parseInt(s); 33 } 34 } 35 36 } 37 else {//正数 38 if(s.length() < 10) { 39 return Integer.parseInt(s); 40 } 41 else if(s.length() > 10) { 42 return 0; 43 } 44 else {System.out.println(s); 45 if("2147483647".compareTo(s) < 0) { 46 return 0; 47 } 48 else { 49 return Integer.parseInt(s); 50 } 51 } 52 } 53 }
法二(借鉴):用转换进制的办法,从最低位开始赋值转换。注意一下中间判断一下溢出即可。代码如下(耗时41ms):
1 public int reverse(int x) { 2 int res = 0; 3 while(x != 0) { 4 int tmp = x % 10; 5 if((res < Integer.MIN_VALUE / 10) || (res > Integer.MAX_VALUE / 10)) {//判断溢出 6 return 0; 7 } 8 res = res * 10 + tmp; 9 x /= 10; 10 } 11 return res; 12 }