给出一个 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;
    }
};

  

01-09 14:24