zoukankan      html  css  js  c++  java
  • LeetCode(7) - Reverse Integer

      题目的要求就是要反转一个Integer,例如输入123,则输出321,这一题比较tricky的地方就是它有可能越界,就是说1234567899,反过来是9987654321是一个越界的Integer,按照题目要求,碰到越界返回0,就好。关键的地方就在于,怎么判断它是否越界呢?一开始为了处理这个越界的问题,我才用了一个大小为10的int数组来存每一位,通过处理最高位来判断是否越界,后来发现有更为简单的方法,代码量要小很多,但是两者在速度上并没有什么太大的区别,代码如下:

      

     1 //思路:用数组去存位数,再翻转。
     2 public class Solution {
     3     public int reverse(int x) {
     4         if (x == 0) return 0;
     5         int[] num = new int[10];
     6         int index = 0;
     7         //x2用来判断x是大于0还是小于0。
     8         int x2 = x;
     9         while (x != 0) {
    10             num[index++] = x % 10;
    11             x = x / 10;
    12         }
    13         int reverseNum = num[0];
    14         for (int i = 1; i < index; i++) {
    15             //注意溢出的情况,不能直接乘以10,因为这样子不能通过正负号判断是否溢出,
    16             //在刚好溢出的时候,最大的变化就是正负号的转变,所以得一个一个加。
    17             if (i == 9) {
    18                 for (int j = 0; j < 9; j++) {
    19                     reverseNum += reverseNum;
    20                     if (reverseNum < 0 && x2 > 0) return 0;
    21                     if (reverseNum > 0 && x2 < 0) return 0;
    22                 }
    23                 reverseNum += num[i];
    24             } else {
    25                 reverseNum = reverseNum * 10 + num[i];
    26             }
    27         }
    28         return reverseNum;
    29     }
    30 }

      后来发现了一个更为简洁的方法,那就是延长输入为long,这样子就不需要判断最高位,直接通过x是否越过Integer的最大最小值就可以判断出来。代码如下:

     1 public class Solution {
     2     public int reverse(int x) {
     3         long reverseNum = 0;
     4         while (x != 0) {
     5             reverseNum = 10 * reverseNum + (long)x % 10;
     6             x = x/10;
     7         }
     8         if (reverseNum > (long)Integer.MAX_VALUE || reverseNum < (long)Integer.MIN_VALUE) return 0;
     9         else return (int) reverseNum;
    10     }
    11 }

      相当简洁。但是如果速度影响不太多的情况下,本人还是倾向于第一种,因为延长Integer to long,总感觉是一种比较tricky的方法,如果输入的不是int x而是long x呢?或者说输入的是一个位数非常大的数字呢?

  • 相关阅读:
    Python 缓冲区
    Python接收执行参数
    Python编码
    Maven 多环境 打包
    JS 时间 获取 当天,昨日,本周,上周,本月,上月
    Window Mysql 5.7.18安装
    Eclipse 更改Maven项目名
    Redis 命令
    Redis 安装 和 启动
    Mongodb 安装 和 启动
  • 原文地址:https://www.cnblogs.com/kepuCS/p/5224740.html
Copyright © 2011-2022 走看看