整数反转
描述:
给出一个 32 位的有符号整数, 你需要将这个整数中每位上的数字进行反转.
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数, 则其数值范围为 [−2^31, 2^31 − 1]. 请根据这个假设, 如果反转后整数溢出那么就返回 0.
思路:
这道题总感觉以前见过, 跟我们上一道做的反转字符串还是有一些些相似的, 但我们不用建立另外的数组来反转整数, 这里我们只需要进行相关的数学操作, 每次拿出整数的最后一位, 放到新建的整数变量 rev 后面, 最后, rev 便和 x 完全相反了.
代码如下:
- class Solution {
- public int reverse(int x) {
- int rev = 0;
- while (x != 0) {
- int pop = x % 10;
- x /= 10;
- rev = rev * 10 + pop;
- }
- return rev;
- }
- }
这是代码第一版, 思路很简单, 但是我们忽略了一个问题, 那便是当 rev = rev * 10 + pop 会发生溢出, 我们这里需要做溢出判断.
假设 rev 为正数, 如果 rev = rev * 10 + pop 发生溢出, 那么一定有 rev>= INTMAX / 10 .
同样的, 当 rev 为负数时, rev <= INTMIN / 10 会发生溢出.
同时我们需要注意 pop 的数值, 题目中整数的数值范围为 [−2^31, 2^31 − 1],231-1=2147483647,-231=-2147483648, 注意最后一位数.
我们修改我们的代码, 添加条件, 当发生溢出时返回 0 .
完整代码如下:
- public class ReverseInt {
- 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;
- }
- public static void main(String[] args) {
- int x = -321;
- ReverseInt reverseInt = new ReverseInt();
- System.out.println(reverseInt.reverse(x));
- }
- }
来源: http://www.jianshu.com/p/64fc974e84d0