给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
原理如图
每次取出最后一位放入新的变量中尾部,取出操作使用取余运算符,插入尾部操作可以使旧数向前移1位加上新的尾部,即旧数*10+最后一位,得到新的number,直到x=0,即所有位都反转成功。
代码如下
class Solution {
//传入并返回整形参数
int reverse(int x){
int number=0;//存放每次转换后的数字
while(x!=0){
//此处的new_number为了判断溢出而创建
int new_number = number * 10+x % 10;
//此条件判断溢出,因为int类型占4个字节内存,不带符号位为31个二进制位,
//假设发生了溢出,数据肯定出现错误,无法复原成与原来相同的数据。
if((new_number - x % 10)/10 != number)
return 0;
//调整位置,循环转换最后一位
number = new_number;
x = x/10;
}
return number;//没有溢出返回最后循环结束的反转整数
}
}
PS:判断溢出条件处利用了int数据类型8个字节,刚好可以表示31位有符号数的特点,一旦产生溢出数据就会发生错误,举个简单的例子:
一个字节最大可以表示无符号数11111111,当随便加上一个数字发生了溢出,一定就会变成一个比他本身小的数,所以无法通过减去刚刚加上的数恢复到原来的数字,即数据发生了错误,也就是溢出。
测试结果: