No.007:Reverse Integer

Posted Gerrard_Feng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了No.007:Reverse Integer相关的知识,希望对你有一定的参考价值。

问题:

Reverse digits of an integer.
Example1:
x = 123, return 321
Example2:
x = -123, return -321

 

官方难度:

Easy

 

翻译:

将一个整数倒转输出。

 

例子:

整数:123,倒转输出:321。

整数:-123,倒转输出:-321。

 

  1. 给定例子中,存在负数情况,将负数的输入转化成整数统一讨论,同时记录负数标志位,在返回时使用。
  2. 优先获取整数的位数,有两种方法:第一种是根据定义出发,循环将输入数字除以10,累加次数。这种方法需要使用一个输入数字的副本,因为在运行过程中会改变输入的值,影响之后的操作;第二种方法,是将输入数字转化成字符串,计算字符串的长度length。显然第二种“取巧的方式”拥有更好的效率。
  3. 定义一个sum值累加,将每一次的输入值的最后一位乘以10的length-1次方,然后将输入除以10,直到循环结束。
  4. 在提交代码之后,发现一个隐藏条件,当倒转的整数超过int所能表达的最大值时该怎么办?要求方法的返回值明确为int值。LeetCode提示我,这种情况返回0。那么就需要将sum升级为long型来存储数字,再返回的时候做一次判断。
  5. 在考虑相反数的时候,有一种极端情况:输入值为Integer.MIN_VALUE。众所周知,负数能表达值的绝对值,比正数的最大值还要大1,这时候对它做相反数操作,这个值是不会变的。万幸,这个数的最后一位是8,这表示在倒转之后的值是0,不用再特殊考虑。
  6. 没有入参检查的必要。

 

解题代码:

 1 public static int reverse(int x) {
 2         // 正负的标志位
 3         int sign = 1;
 4         // 考虑负数转化
 5         if (x < 0) {
 6             x = -x;
 7             sign = -1;
 8         }
 9         long sum = 0;
10         // 先获取位数
11         int length = String.valueOf(x).length();
12         // 取余数,乘以因子累加
13         while (x > 0) {
14             // 要先减length
15             sum += (x % 10) * Math.pow(10, --length);
16             x /= 10;
17         }
18         return sum > Integer.MAX_VALUE ? 0 : (int) sum * sign;
19     }
reverse

 

相关链接:

https://leetcode.com/problems/reverse-integer/

https://github.com/Gerrard-Feng/LeetCode/blob/master/LeetCode/src/com/gerrard/algorithm/easy/Q007.java

 

PS:如有不正确或提高效率的方法,欢迎留言,谢谢!

 

以上是关于No.007:Reverse Integer的主要内容,如果未能解决你的问题,请参考以下文章

Buuctf-Reverse(逆向) [RoarCTF2019]Polyre && SangFor(深育杯)-Reverse(逆向) XOR_Exercise Write up(代码片

7. Reverse Integer

Reverse Integer

leetcode-7. Reverse Integer

Reverse Integer--Easy

leetcode7. Reverse Integer