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

  • 相关阅读:
    VS2005 无法启动调试 (如果你用的是IE8的)
    ClickOnce:部署,强制要求用户使用最新发布版本才可以执行软件的方法
    .Net 中的webBrowser控件加载网页时实现进度显示
    C# :DataGridView中使按下Enter键达到与按下Tab键一样的效果?
    Jquery:getJSON方法解决跨站ajax (json的解剖和运用) 附图片加载时的loading显示...
    GoogleMap : [Google Map]GMark事件运用(GEvent)
    Expression Designer系列工具汇总
    webBrowser:在extendedwebbrowser中实现IDocHostShowUI.ShowMessage 并判断或触发相应事件
    C#: 中文和UNICODE字符转换方法 及仿安居客地图实现。。。错误 GMap2未定义 解决办法 VB 中文转为UNICODE字符
    Jquery :Ajax 自动完成下拉列表。。。。。
  • 原文地址:https://www.cnblogs.com/zijianhua/p/8682455.html
Copyright © 2020-2023  润新知