持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第6天,点击查看活动详情
题目描述
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例 1:
输入:x = 123 输出:321
示例 2:
输入:x = -123 输出:-321
示例 3:
输入:x = 120 输出:21
示例 4:
输入:x = 0 输出:0
提示:
-231 <= x <= 231 - 1
思路
取出来每一个数字可以这样操作,原数字设置为x=1234,然后x模10就可以得到最后一个数字即4,取出来后再除以10就可以把刚刚得到的4删掉;如此反复下去,就可以把每一位数字提取出来。
然后就是把每一个数字逆序组装回去,可以这样操作r=r*10+x%10。这样就可以倒序输出了。
注意:这里负数也是一样的操作方法,当取出每一个数字的时候,并且原数字是负数时,通过模的运算得到的每一位数字也是负数的。即-1234%10=-4。
题目做到这我们已经想到了基本的解决方案了,即把每一位数字拆出来再逆序拼回去,就可以得到满足题意的答案了。
但是值得注意的是我们的原数据超过界限时应该返回0。这里的做法就是使用长整形来存储我们的答案,如果最后得出来的数据超过了int的最大值或者小于int的最小值,那么我们就返回0。
代码
class Solution {
public:
int reverse(int x) {
long long res = 0;
while(x)
{
res = res * 10 + x % 10;
x /= 10;
}
if(res > INT_MAX || res < INT_MIN) return 0;
return res;
}
};
改进:通过循环将数字x的每一位拆开,在计算新值时每一步都判断是否溢出。 溢出条件有两个,一个是大于整数最大值MAX_VALUE,另一个是小于整数最小值MIN_VALUE
class Solution {
public:
int reverse(int x) {
int res = 0;
while(x)
{
if(res > 0 && res > (INT_MAX - x %10) / 10) return 0;
if(res < 0 && res < (INT_MIN - x %10) / 10) return 0;
res = res * 10 + x % 10;
x /= 10;
}
return res;
}
};