(leetCode)Reverse Integer—颠倒整数

题目如下:

给定一个范围为 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最近才开始刷,刚开始压力还是有的,平时大多数都在写工作中的代码,对这种纯算法题目的经验比较少,不过,加油吧!!!

 

posted @ 2018-04-01 21:23  一脸的美人痣  阅读(271)  评论(0编辑  收藏  举报