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。
- 给定例子中,存在负数情况,将负数的输入转化成整数统一讨论,同时记录负数标志位,在返回时使用。
- 优先获取整数的位数,有两种方法:第一种是根据定义出发,循环将输入数字除以10,累加次数。这种方法需要使用一个输入数字的副本,因为在运行过程中会改变输入的值,影响之后的操作;第二种方法,是将输入数字转化成字符串,计算字符串的长度length。显然第二种“取巧的方式”拥有更好的效率。
- 定义一个sum值累加,将每一次的输入值的最后一位乘以10的length-1次方,然后将输入除以10,直到循环结束。
- 在提交代码之后,发现一个隐藏条件,当倒转的整数超过int所能表达的最大值时该怎么办?要求方法的返回值明确为int值。LeetCode提示我,这种情况返回0。那么就需要将sum升级为long型来存储数字,再返回的时候做一次判断。
- 在考虑相反数的时候,有一种极端情况:输入值为Integer.MIN_VALUE。众所周知,负数能表达值的绝对值,比正数的最大值还要大1,这时候对它做相反数操作,这个值是不会变的。万幸,这个数的最后一位是8,这表示在倒转之后的值是0,不用再特殊考虑。
- 没有入参检查的必要。
解题代码:
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 }
相关链接:
https://leetcode.com/problems/reverse-integer/
PS:如有不正确或提高效率的方法,欢迎留言,谢谢!
以上是关于No.007:Reverse Integer的主要内容,如果未能解决你的问题,请参考以下文章
Buuctf-Reverse(逆向) [RoarCTF2019]Polyre && SangFor(深育杯)-Reverse(逆向) XOR_Exercise Write up(代码片