leetCode 7整数反转

不许使用64位。

方法一

int reverse(int x){
    int ret=0,tem=0;
    while(x != 0){
        tem = x % 10;
        if(ret>214748364||ret == 214748364 && tem == 7){
            return 0;
        }
        if(ret < -214748364|| ret == -214748364&&tem == -8){
            return 0;
        }
        x = x / 10;
        ret = ret * 10 + tem;
    }
    
    return ret;
}

 方法二,使用unsigned 将ret转化从int转化为无符号数

当x为正数时,如果无越界的情况发生,一切正常,发生了越界后,unsigned 转换到int 会有一个类型转换。

如果x为负数时,如果无越界发生(鉴于无符号与有符号数之间的位模式不变)一切都可以顺利进行,如果发生越界,也会有一个转换。

int reverse(int x){
    int ret = 0;
    while(x){
        int t = (unsigned)ret * 10;
        if(t / 10 != ret){
            return 0;
        }
        ret = t + x % 10;
        x /=10;
    }
    
    return ret;
}

按照上面的这种非常优秀的方法,我将unsigned加入我之前报错的代码,得到了正确的结果

int reverse(int x){
    int ret=0 ;
    while(x != 0){
        int tem = (unsigned) ret*10 + x % 10;
        x = x / 10;
        if(tem / 10 != ret){
            return 0;
        }
        ret = tem;
    }
    
    return ret;
}

对的,我们做法几乎一样,由于我没有想到unsigned的使用,导致问题出现。

 方法3:始终判断rev,是否小于INT_MIN /10 或是否大于INT_MAX /10,满足这个条件才能够接着计算,否者为0.

int reverse(int x){
    int rev=0;
    while(x){
        if(rev<INT_MIN/10||rev>INT_MAX/10)
            return 0;
        rev = rev*10+x%10;
        x=x/10;
    }
    return rev;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值