题目
给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例1:
1 | 输入: 123 |
示例2:
1 | 输入: -123 |
示例3:
1 | 输入: 120 |
解法
解法一:
反向取数字的每一位,相加
Java
1 | class Solution { |
但是,当输入是1534236469时,反转之后的数值就会溢出,造成结果不对。
那么,就需要在循环中判断res在什么时候可能溢出,如果溢出的话,就直接返回0。
在Java中,int的取值范围为-2147483648~2147483647。那么只要在res乘以10之前,判断res是否可能溢出即可。
分四种情况:
- res 大于Integer.MAX_VALUE / 10,此时res * 10之后一定会溢出,返回0;
- res等于Integer.MAX_VALUE / 10,并且,下一个待加的数字pop大于7,res * 10 + pop 一定会溢出,返回0;
- res小于Integer.MIN_VALUE / 10,此时res * 10之后一定会溢出,返回0;
- res等于Integer.MIN_VALUE / 10,并且,下一个待加的数字pop小于-8,res * 10 + pop一定会溢出,返回0;
以下是修改后的代码:
1 | int reverse(int x) { |
解法二:
反向取数字相加,在循环的过程中,判断数字是否溢出。
当ans * 10 / 10 != ans时,数字溢出
ans = ans * 10 + x % 10 是不会溢出的,ans * 10 得到的数是以0结尾的,而x % 10得到的数只能是0-9,因此两者相加不会产生进位。
Java
1 | public int reverse(int x) { |