其他分享
首页 > 其他分享> > 力扣 T7. 整数反转

力扣 T7. 整数反转

作者:互联网

题意:

给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [-2^{31}2^{31}-1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

2^{31}=2147483648

由于题目要求不能使用64位整数,不能使用64位整数判断反转后的数字是否在题目要求范围之内。因此,需要使用整型数组存储反转后的整数,再比较反转后是否超出范围。

int Reverse(int x){
    //2147483648
    int p,t=0,ans=0;                   //p标志正负,t代表位数
    int num[15]={};                    //num数组存放反转后的整数
    int nump[11]={2,1,4,7,4,8,3,6,4,7};//2的31次方-1,用于比较正数
    int numn[11]={2,1,4,7,4,8,3,6,4,8};//2的31次方,用于比较负数
    
    //先判断是正数还是负数,统一转化成正数处理
    if(x>0)p=1;
    else if(x==-2147483648||x==0)return 0;//特殊处理0和-2的31次方
    else p=0,x=-1*x;

    while(x>0)
        num[t]=x%10,x/=10,t++;

    if(t<10)                            //位数小于10位,则必然小于2的31次方=2147483648
    {                                   //直接反转
        for(int i=0;i<t;i++)
            ans=num[i]+ans*10;
        if(p==0)ans=-1*ans;
    }
    else                                //位数大于10位,需要判断。与左右的两端点逐位比较
    {
        if(p==1)                        //正数,与nump逐位比较
            for(int i=0;i<t;i++)
            {
                if(num[i]<nump[i])break;
                if(num[i]>nump[i])return 0;
            }    
        else                            //负数,与numn逐位比较
            for(int i=0;i<t;i++)    
            {
                if(num[i]<numn[i])break;
                if(num[i]>numn[i])return 0;
            }

        for(int i=0;i<t;i++)
            ans=ans*10+num[i];
        if(p==0)ans*=-1;
    }
    return ans;
}

 

标签:return,int,T7,整数,else,力扣,64,反转
来源: https://blog.csdn.net/coconutmilktea/article/details/122628345