题目如下:
给定一个范围为 32 位 int 的整数,将其颠倒。
例 1:
输入: 123 输出: 321
例 2:
输入: -123 输出: -321
例 3:
输入: 120 输出: 21
注意:
假设我们的环境只能处理 32 位 int 范围内的整数。根据这个假设,如果颠倒后的结果超过这个范围,则返回 0。
思路一:
1.将int转String,然后通过处理字符串反转的方式,得到初步字符串结果
2.考虑输入的int是否为负数
3.考虑是最终结果是否超出int的范围,因为超出范围,String 转int就会出错,偷懒方式可以加一个异常捕获
初步代码如下:
1 public int reverse(int x) { 2 3 Boolean flag = false; 4 String xStr = String.valueOf(x); 5 if (x < 0) { 6 x = -x; 7 flag = true; 8 xStr = xStr.substring(1); 9 } 10 11 if (xStr == null || xStr.length() > 32) { 12 return 0; 13 } 14 15 StringBuilder sb = new StringBuilder(); 16 for (int i = xStr.length(); i > 0; i--) { 17 String temp = xStr.substring(i-1, i); 18 sb.append(temp); 19 } 20 21 Long tempResult = Long.valueOf(sb.toString()); 22 if (tempResult > Math.pow(2,31) || -tempResult > Math.pow(2,31) + 1) { 23 return 0; 24 } 25 if (flag) { 26 if (-tempResult > Math.pow(2,32) + 2) { 27 return 0; 28 } else { 29 return -tempResult.intValue(); 30 } 31 32 } else { 33 if (tempResult > Math.pow(2,31)) { 34 return 0; 35 } else { 36 return tempResult.intValue(); 37 } 38 } 39 }
在此基础上继续调整一下代码,下面的写法和上面的思路是一样的,只是避免了造轮子,不用写字符串反转的代码,使之看上去更优雅一点:
1 public int reverse(int x) { 2 String xStr = String.valueOf(x); 3 StringBuilder sb = new StringBuilder(xStr); 4 System.out.println(sb.toString()); 5 6 //使用StringBuilder 的 reverse()方法,反转字符串 7 xStr = sb.reverse().toString(); 8 System.out.println(xStr); 9 10 //判断x 是正数还是负数 11 long resultLong = 0; 12 if (xStr.endsWith("-")) { 13 resultLong = -Long.valueOf(xStr.substring(0, xStr.length() - 1)); 14 } else { 15 resultLong = Long.valueOf(xStr.substring(0, xStr.length())); 16 } 17 18 //判断颠倒后的数字是否已经超出了int的范围,如果超出返回0 19 if (resultLong > Integer.MAX_VALUE || resultLong < Integer.MIN_VALUE) 20 { 21 return 0; 22 } 23 24 return (int)resultLong; 25 } 26
以上两种效率都会比较低,在反转字符串的时候都是非常耗时的。
考虑到时反转的是int类型的,那是不是可以根据取商和取余的方式,每次都除以10,把商作为下次除法的被除数,并把余数作为结果的一部分从左到右显示,代码如下:
1 public int reverse(int x) { 2 3 long resultLong = 0; 4 while(x != 0) { 5 resultLong = resultLong * 10 + x%10; 6 x /= 10; 7 } 8 9 if (resultLong > Integer.MAX_VALUE || resultLong < Integer.MIN_VALUE) { 10 return 0; 11 } 12 13 return (int)resultLong; 14 15 }
LeetCode最近才开始刷,刚开始压力还是有的,平时大多数都在写工作中的代码,对这种纯算法题目的经验比较少,不过,加油吧!!!