7. 整数反转
Posted 7TribeZ
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了7. 整数反转相关的知识,希望对你有一定的参考价值。
家人们,我出息了
题目
难度简单2739
给你一个 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
解析
while循环中间的式子很好想,这题重点在于题目给了int 限制
注意几个点
1. -123%10 = -3
2. 2^31=2 147 483 648
3. sum= (sum< -2147483649/10 || sum> 2147483649/10) ? 0: (sum*10+i); 这个式子为什么可以,会不会漏掉一些数?
分析知道 sum 在做 sum*10+i 之前 必须保证 −2^31≤sum*10+i≤2^31−1 那么负数这一边,sum<-2147483649/10 可以表示以5或大于5结尾直接返回0(因为乘以10之后必然超过范围)。正数这一边,
sum> 2147483649/10 可以也表示以5或大于5结尾直接返回0(因为乘以10之后必然超过范围)。那这样挺合理的,那要不要考虑最后一位呢?比如正数时,214748364 最后一位万一是9岂不是超过范围了?
然而输入其实已经限制了是 int x,也就是输入 x 最大就是 2147483648 就保证了翻转的最后一位最长情况下也只能是1或2 而不会是9。 负数时也是同理。 所以这么可以这么写。
c++
class Solution {
public:
int reverse(int x) {
int i=0;
int sum=0;
while(x!=0)
{
i=x%10;
x=x/10;
sum= (sum< -2147483649/10 || sum> 2147483649/10) ? 0: (sum*10+i);
}
return sum;
}
};
以上是关于7. 整数反转的主要内容,如果未能解决你的问题,请参考以下文章