leetcode#7整数反转,用数组解

leetcode#7整数反转

用数组解

一.题目

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转。

1.1注意:

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [ − 2 31 , 2 31 − 1 ] [−2^{31} ,2^{31} − 1] [231,2311]请根据这个假设,如果反转后整数溢出那么就返回 0

1.2示例

  • leetcode#7
    • 整数反转
xoutput
123-123
-123-321
12021
00

二.题解

2.1整体思路

该题需要将整数反转输出,关键是不能溢出,输入系统给值不会溢出,输出可能溢出。考虑到负数可以表示更多的位数,我们选择用一个symbol记录符号,负数储存反转的整数的数值。判断它是否溢出,无溢出则输出结果。

2.2流程

2.2.1取符号与数值

symbol=1表示负数
symbol=0表示正数
将x的值统一为负
用一个数组num[10]将数值各位储存,具体实现见代码实现。
注意:(1)位数
2 31 = 2147483648 2^{31}= 2147483648 231=2147483648
(2)x与下标
-我的程序中若x=2147

位数
x2147
numnum[3]num[2]num[1]num[0]
2.2.2判断溢出

当x为10位数即num[9]!=0时,x才有可能溢出。这里我又取了2^31的各个位组成一个数组lim[],并用了声明一个full来表示判断的状态,full初始为1,表示reverse在溢出边缘。将倒置的各个数位与2的31次方的各个数位比较,若溢出则返回0,若相等则full=1,若num[]>lim[]则full=0,并用full作为下次循环是否判断溢出的条件。
注意:我取到的各个位数均为负值。

2.2.3输出结果

声明reverse储存结果,判断符号并输出。

三.代码实现

3.1代码

class Solution {
public:
int reverse(int x) {
int num[10]={0},reverse(0),lim[10]={0};
bool symbol(1),full(1);
int rest(0);
int i(0),j(1),l(-2);
if(x>0)
{
symbol=0;
x=-x;
}
rest=x; //注意rest在x统一符号后赋值
while(rest!=0)//此处取各个数位,个位下标0十位下标1
{
num[i]=rest%10;
++i;
rest/=10;

    }
    if(num[9]==0)
    {   
       for(j=0;j<i;)
       {
            reverse=reverse*10+num[j];
            ++j;
       }
    }
    else
    {        for(j=1;j<31;)//求2^31
            {
                l=l*2;
                j++;
            }
            rest=l;//取2^31各个数位

            for(j=0;rest!=0;)
            {
            lim[j]=rest%10;
            j++;
            rest/=10;
            }
            
            for(j=9,i=0;j>=0;)//注意各个位之间对应关系
            {//取得的x的个位num[0]作reverse的十位同2^31的十位lim[9]比较
            
        if(full==1&&lim[j]>num[i])
                return 0;
        else if(full==1&&(lim[j]<num[i]))
         full=0;
     
         reverse=reverse*10+num[i];
            --j;
            ++i;
            }
        if(symbol==0&&full==1)
        return 0;
    }
    if(symbol==1)//判断符号,输出;
return reverse;
else
return -1*reverse;
    
   
   return 0;}

};

3.2leetcode得分

执行用时:4 ms在所有 C++ 提交中击败了52.94%的用户
内存消耗:6 MB在所有 C++ 提交中击败了81.48%的用户

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值