LeetCode刷题总结(三)7-9

(1)LeetCode7:整数反转

解决本题要有几个常识:

①. 对于一个整数来说,要把它的每一位数抠出来,就是先模10取出个位,再除以10,将个位去掉,循环该过程,知道全部都被去掉了。
while(x) { // x为被处理的数,当x为0时,即跳出循环
cout << x % 10;
x /= 10;
}
②. 剥离开来之后要还原,则为:
r = 0; // r 是目标值
r = r * 10 + 第一位;
r = r * 10 + 第二位
r = r * 10 + 第三位
… 直到所有数都用完了
当现在要逆序输出时,我们可以将两者合并:
r = 0;
while(x) {
r = r * 10 + x % 10;
x /= 10;
}
③. 还有一个情况,当 x 为负数时,当如何处理呢?
C ++ 有一个特殊的特性,负数模(%)10仍然是负数(注意这仅仅是C++中适用,然而从数学上说,一个数a对10取模,结果b应该满足:a - b = 10k , k = 自然数):

cout << 1234 % 10; // 4
cout << -1234 % 10; // -4

由此特性,所以以上代码仍然可以适用。
④. 由于本题要求“反转后整数超过 32 位的有符号整数的范围 [−2^31, 2^31 − 1] ,就返回 0”,所以我们可以采用C++中的INT_MAX,INT_MIN来做判断。因为int占4字节32位,根据二进制编码的规则,INT_MAX = 2^31-1,INT_MIN= -2^31.

有了以上的理论基础,我们就可以来实战此题了:

class Solution {
   
public:
    int reverse(int x) {
   
        long long r = 0; // r 为最终的目标反转结果,初始值必须赋为0,这是为了能够从0开始加和
        // 注意这里采用了long long,所以不需要考虑溢出的情况,当数足够大时,r是有可能溢出的
        while(x) {
    // 当x被除为0后,退出循环
            r = r * 10 + x % 10; // 将取出来的个位放在首位上
            x /= 10; // 由于x的个位已经用完了,所以将其去掉
        }
        if (r > INT_MAX) return 0; 
        // r > INT_MAX或小于int的最小范围都返回0
        if (r < INT_MIN ) return 0;
        return r; // 返回对应的值
    }
};

不使用 long long 的思路:(不使用long long就要考虑正负溢出的情况),因为本题中有“假设环境不允许存储 64 位整数(有符号或无符号)”,所以不建议使用long long,但反转后 r 可能会非常小或非常大,那么怎么解决 r 超出int范围呢?
其实就是在循环中就去判断r是否溢出即可(因为这个数字在循环过程中随时可能超出范围),相对的,long long可以保证在循环完之后再判断,不用自己写很多判断溢出的条件。
解决溢出的方式】如何确定溢出的条件:(当然应该要在开始切割前就判断!!!)
i. 当 r > 0 时, r会大到溢出:
r * 10 + x % 10 > INT_MAX ------> r > (INT_MAX - x % 10) / 10 (溢出条件)
ii. 当 r < 0 时, r会小到溢出:
r * 10 + x % 10 < INT_MIN ------> r < (INT_MIN - x * 10) / 10 (这个条件是可以逻辑成立的,因为一个极小的负数减去一个负数是会变大的) .

class Solution {
   
public:
    int reverse(int x) {
   
        int r = 0
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值