leetcode 7 整数反转 c++

7整数反转

题目链接:https://leetcode-cn.com/problems/reverse-integer/submissions/

这个题也是一个输出控制,本身不难,难在对特殊测试样例的处理。题目要求反转后溢出的数(在$ [−2^{31}, 2^{31} − 1] 范 围 以 外 ) , 输 出 结 果 要 是 0 , 这 就 挺 烦 的 了 。 我 是 先 把 负 数 输 入 变 成 正 的 , 再 取 余 移 位 , 但 这 里 就 有 个 问 题 , 负 数 是 可 以 输 入 范围以外),输出结果要是0,这就挺烦的了。我是先把负数输入变成正的,再取余移位,但这里就有个问题,负数是可以输入 0-2^{31}$的,但是变成正数 2 31 2^{31} 231就溢出了,所以先要处理这个特殊的数。然后就是反转溢出的判定,这里我原来写的是:

if((result*10+signal*(tem%10))>(pow(2,31)-1)||(result*10+signal*(tem%10))<(-pow(2,31))){

也就是先乘起来再和边界比较,结果发现(result*10+signal*(tem%10)是会溢出的,就改成了

if(result>((pow(2,31)-1-signal*(tem%10))/10)||result<((-pow(2,31)-signal*(tem%10))/10)){

这样子(pow(2,31)-1-signal*(tem%10)是绝不会溢出的,原因就在于pow返回的类型是double,这范围就大了( [ − 1.7 ∗ 1 0 308 , − 1.7 ∗ 1 0 − 308 ] ⋃ [ 1.7 ∗ 1 0 − 308 , 1.7 ∗ 1 0 308 ] [-1.7*10^{308},-1.7*10^{-308}]\bigcup[1.7*10^{-308},1.7*10^{308}] [1.710308,1.710308][1.710308,1.710308],这样子就不会溢出了。

class Solution {
public:
    int reverse(int x) {
        int result=0;
        int signal=1;
        int tem=x;
        if (x<0){
            signal=-1;
            if(x==-pow(2,31)){
                tem=0;
            }
            else{
                tem=-x;
            }
        }
        while(tem!=0){
            if(result>((pow(2,31)-1-signal*(tem%10))/10)||result<((-pow(2,31)-signal*(tem%10))/10)){
                result=0;
                break;
            }
            result=result*10+signal*(tem%10);
            tem=(int)(tem/10);
        }
        return result;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值