整数反转
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
题目链接:https://leetcode-cn.com/problems/reverse-integer/
题解思路:
如果不考虑益处的话,这道题目的思路并不难。那么如何解决溢出哪?
我的思路是直接用long类型
System.out.println(Long.BYTES);//8个字节
最后判断运算的结果是否溢出即刻。
if (result>Integer.MAX_VALUE||result<Integer.MIN_VALUE){ return 0; }
主要代码:
public int reverse(int x) { long result = 0; long numAbs = x; while (numAbs!=0){ int temp = (int)numAbs % 10; numAbs = numAbs/10; result = result + temp; result = result * 10; } result = result / 10; if (result>Integer.MAX_VALUE||result<Integer.MIN_VALUE){ return 0; } return (int)result; }
这种方法比较笨,因为是采用了大瓶装小瓶的办法,所以避免了溢出。但是万一题目给定的数据超出了“大瓶”的容量呢?
官方题解的方法值得学习:
首先采用数学方法模拟进出栈的操作解决整数反转的问题。如下:
//pop operation: pop = x % 10; x /= 10; //push operation: temp = rev * 10 + pop; rev = temp;
然后留意溢出时的情况。(假设rev为正整数)
当rev为负数时可以应用类似的逻辑。
class Solution { public int reverse(int x) { int rev = 0; while (x != 0) { int pop = x % 10; x /= 10; if (rev > Integer.MAX_VALUE/10 || (rev == Integer.MAX_VALUE / 10 && pop > 7)) return 0; if (rev < Integer.MIN_VALUE/10 || (rev == Integer.MIN_VALUE / 10 && pop < -8)) return 0; rev = rev * 10 + pop; } return rev; } }