力扣--整数反转
整数反转
题目
Category | Difficulty | Likes | Dislikes |
---|---|---|---|
algorithms | Easy (34.99%) | 2573 | - |
给你一个 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
这个题目粗略看起来是对整数进行切分,之后再加起来。
int reverse(int x)
{
int end = 0;
// 个位数/10 = 0 刚好可以当做结束条件
while (x)
{
// -100/10 = -10(符号不会掉) 憨憨
end = x % 10 + end * 10;
x = x / 10;
}
cout << x;
return end;
}
本来以为完美运行的代码,直接一波报错,显示数据溢出。
那么要怎么来解决这个溢出问题呢??
报错表示,在end*10这个地方发生了溢出,那么我们就在end赋值之前添加一个判断
虽然提交通过,但是这个判断还是存在漏洞的
? 若end刚好等于max/10
,则后面乘以10再加上x%10
之后溢出了怎么办呢??那么x%10
就得确定一个上限
? 由于:
? INTMAX % 10 = 7
? INTMIN % 10 = -8
改正后的代码如下:
虽然这道题看似简单,但是还是考到了一些平时不会去注意的地方。