给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。
示例 1:
输入: 123
输出: 321
示例 2:
输入: -123
输出: -321
示例 3:
输入: 120
输出: 21
注意:
假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2, 2 − 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; } };