首页 > 其他 > 详细

leetcode 7 整数反转

时间:2019-10-28 17:07:01      阅读:78      评论:0      收藏:0      [点我收藏+]

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

  

 

leetcode 7 整数反转

原文:https://www.cnblogs.com/xiying159/p/11753182.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!