7. Reverse Integer

题意描述:
Reverse digits of an integer.
Example1: x = 123, return 321
Example2: x = -123, return -321

错误解法:

class Solution {
public:
    int reverse(int x) {
        int sum = 0;
        while((x*10)/10){
            sum *= 10;
            sum += x%10;
            x /= 10;
        }
        return sum;
    }
};

没有考虑到溢出
错误解法

AC解法:

class Solution {
public:
    int reverse(int x) {
        int sum = 0;
        while((x*10)/10){
            if(is10Overflow(sum)){
                return 0;
            }else{
                sum *= 10;
            }
            if(isAddOverflow(sum, x%10)){
                return 0;
            }else{
                sum += x%10;
            }
            x /= 10;
        }
        return sum;
    }
    bool isAddOverflow(int a, int b){
        int c = a + b;
        return ((a > 0 && b > 0 && (c < a || c < b)) || ( a < 0 && b < 0) && ( c > a || c > b));
    }
    bool is10Overflow(int a){
        if (a > 0x7FFFFFFF / 10 || a < (int)(0x80000001) / 10)
            return true;
        else
            return false;
    }
};

关于最大值最小值:

    cout << 0xFFFFFFFF << endl; //4294967295 = 2^32 - 1
    cout << 0x7FFFFFFF << endl; //2147483647(max) = 2^31 - 1
    cout << 0x80000001 << endl; //2147483649
    cout << (int)0xFFFFFFFF << endl; // -1
    cout << (int)0xFFFFFFFE << endl; // -2
    cout << (int)0x80000001 << endl; // -2147483647(min)
    cout << sizeof(char) << endl; //1
    cout << sizeof(int) << endl; //4
    cout << sizeof(float) << endl; //4
    cout << sizeof(string) << endl; //8
    cout << sizeof(int8_t) << endl; //1
    cout << sizeof(int16_t) << endl; //2
    cout << sizeof(int32_t) << endl; //4
    cout << sizeof(int64_t) << endl; //8
    cout << sizeof(unsigned) << endl; //4

关于溢出:
加法溢出:

a和b都是正数时,如果a与b的和小于a或者小于b,则溢出;
a和b都是负数时,如果a与b的和大于a或者大于b,则溢出;

乘法溢出:

int is_mul_overflow(int a, int b) {
    if( a >= 0 && b >=0  ) {
        return INT_MAX / a < b;
    }
    else if( a < 0 && b < 0 ) {
        return INT_MAX / a > b;
    }
    else if( a * b == INT_MIN ) {
        return 0;
    }
    else {
        return a < 0 ? is_mul_overflow(-a, b) : is_mul_overflow(a, -b);
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值