[Leetcode][C++] reverse integer

太菜了,好多基础的东西都不会;9.

一,

1个字节共8位,int 类型共有4个字节,根据二进制编码的规则,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_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.

猜你喜欢

转载自blog.csdn.net/T2777/article/details/82932514
今日推荐