[Leetcode][C++] 7. reverse integer

太菜了,好多基础的东西都不会 :(

一,

1个字节共8位,int 类型共有4个字节,共32位,根据二进制编码的规则,INT_MAX = 2^31-1,INT_MIN= -2^31(-INT_MAX-1).C/C++中,所有超过该限值的数,都会出现溢出,出现warning,但是并不会出现error。如果想表示的整数超过了该限值,可以使用长整型long long 占8字节64位。

关于INT_MAX与INT_MIN的计算问题,在出现溢出时,不遵循数学计算,INT_MIN = 0x10000000,INT_MAX=0x7fffffff。共32位,8*4。

INT_MAX+1 = INT_MIN,

INT_MIN - 1 = INT_MAX,

abs(INT_MIN) = INT_MIN.

二,

-7%3 = -1, 说明负数取余得到负数。

三,问题:

Given a 32-bit signed integer, reverse digits of an integer

最重要的就是解决溢出的问题,给定的 x 是 int 类型的,32位,最多只能表示到 -2^31--2^31 - 1(算上0恰好共有2^32个数,要把符号位算上),发生溢出的数,输出为0。

代码如下:对于倒序的算法很容易理解,即使是负数,或者以0为最后一个字母的数都可以解决,之所以INT_MAX/10是因为要在结束循环前一步就进行阻止。这个算法看起来还可以继续准确一下。

class Solution {
public:
    int reverse(int x) {
        int res = 0;
        while(x!=0){
            if(abs(res)>INT_MAX/10) return 0;
            res = res*10 + x % 10;
            x /= 10;
        }
        return res;
    }
};

还有一种用 long 来做的,因为 long 认为是64位,(实际上有些编译器上认为long 和 int 都是4 个字节,基本没有差别,但是这里认为是8个字节,而long long 确定是64位的,用long long 代替下面的long 也12ms过,long 和long int ,long long 和 long long int 是一回事,但是加了int 在后面以后,用了24ms是怎么回事,leetcode 应该不能用 _int64,_int64和 long long 应该是一样的)在出现题目溢出的情况时,可以用在范围内判断出来,当然,实际上还是有一点风险的,当输入的数比64位还多时,就会出现错误,代码通过:

class Solution {
public:
    int reverse(int x) {
        long res = 0;
        while(x!=0){
            res = res * 10 + x % 10;
            x /= 10;
        }
        if(res > INT_MAX || res < INT_MIN)
            return 0;
        return (int)res;
    }
};

  两个都是12ms.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值