给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−231, 231 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/reverse-integer
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
这个题用long判断溢出即可,然而我在用int(少想了好多条件一直错orz)做完之后才想到。
基本思路:
1.取出x的个位数(取模%的余数本身是带符号的),然后ans=ans*10+个位数,x/=10;
2.判断ans是否溢出。
class Solution {
public:
int reverse(int x) {
long cur=(long)x;
long ans=0;
int flag=0;
if(x<0) flag=1;
long max1=2147483647;
long min1=-2147483648;
while(cur!=0)
{
int sgl=cur%10;
cur/=10;
ans=ans*10+sgl;
if(ans>max1||ans<min1) return 0;//long判断溢出
}
return (int)ans;
}
};
那么int呢?首先就是溢出要返回0,那么必须在溢出前判断出溢出,否则超过int限制就会立即报错。
同上面的思路,只是在每次乘以十之前判断:
1.已经计算的结果大于了上限除以10(负数则小于)。返回0;
*2.已经计算的结果恰好等于上限除以10。判断个位数是否超限。超限则返回0;
class Solution {
public:
int reverse(int x) {
int ans=0;//返回值
int maxi=1;//计算上限2^31
for(int i=0;i<30;i++)
maxi*=2;
maxi=((maxi-1)*2+1);//最后一个2当然只能这么算,也可以用负数
int max1=maxi/10;//上限。十位数以上部分
int max2=maxi%10;//上限。个位数
int min1=0-max1;
int min2=0-max2-1;
while(x!=0)
{
int sgl=x%10;
x/=10;
if(ans>max1 || ans<min1 ||//十位数超限
(ans==max1 && sgl>max2) ||//个位数超上限
(ans==min1 && sgl<min2)) //个位数超下限
return 0;
else
ans=ans*10+sgl;
}
return ans;
}
};
原文:https://www.cnblogs.com/xiying159/p/11753182.html