题目描述:
输入输出实例:
思路:
题目中说的是整数的反转,我们可以很自然的想到stack和stringBuild来实现整数的反转,先将整数转化为字符串,然后对字符串进行操作,实现字符串的反转,最后在进行判断。
需要注意的是,题中提示假设环境只能存储32位的整数,所以不能利用long来存储大于int最大值的整数,当然用int存的话会发生数据溢出,导致结果的不正确。
解析:
首先我们需要实现的是整数的反转。
比如说我们有一个数字123
首先我们取出最后一个数字(123%10=3),赋给res = 3 ;
然后让x/10,x就变成了12,然后再取出末尾的数字,加到res的后面,res就变成了32,进行同样的操作,最后res=321;
int res = 0;//初始化为0
int tmp = x % 10;//最后一位数字
res = res * 10 + tmp;//取出来的尾数,加到res上
x /= 10;//去掉最后一位数字
这样我们就实现了整数的反转。
怎么控制次数呢?
每次我们都对x进行除10操作,当只剩一位数时候,取余数就取的是他本身,当把它加到res上以后,对他进行除10操作以后就等于10le
所以控制条件就为x!=0;
x!=0
最需要注意的一点:
反转后整数的溢出。
int值的范围在-2147483648~2147483647之间
所以我们要对反转的结果就行判断。
题目中说假设只能存储32为的整数,所以我们不能借助long来判断。
那应该怎么判断呢?
我们可以在达到最大整数之前就开始判断,
如下图所示
为什么不用最终的结果判断是不是处于-2147483648~2147483647之间呢,
因为当结果不处于这个范围int会发生溢出,所以不论结果如何,都不可能发生溢出,所以在十位的位置我们就进行判断,
在这//判断是否 大于 最大32位整数
if (res > 214748364 || (res == 214748364 && tmp > 7)) {
return 0;
}
//判断是否 小于 最小32位整数
if (res < -214748364 || (res == -214748364 && tmp < -8)) {
return 0;
}里插入代码片
最终代码:
public static int reverse4(int x) {
int res = 0;
while (x != 0) {
//每次取末尾数字
int tmp = x % 10;
//判断是否 大于 最大32位整数
if (res > 214748364 || (res == 214748364 && tmp > 7)) {
return 0;
}
//判断是否 小于 最小32位整数
if (res < -214748364 || (res == -214748364 && tmp < -8)) {
return 0;
}
res = res * 10 + tmp;
x /= 10;
}
return res;
}