【lettcode】整数反转

文章目录

  • 题目描述
  • 题解:


题目描述

整数反转
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。

如果反转后整数超过 32 位的有符号整数的范围 [−231, 231 − 1] ,就返回 0。

假设环境不允许存储 64 位整数(有符号或无符号)。

示例 1:

输入:x = 123
输出:321
示例 2:

输入:x = -123
输出:-321
示例 3:

输入:x = 120
输出:21
示例 4:

输入:x = 0
输出:0

提示:

-231 <= x <= 231 - 1

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/reverse-integer
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解:

这道题不允许使用long long类型进行操作,所以需要进行一些判断。
首先取模的理解: -123%10 的结果是啥,在C++当中是-3,有的语言的结果是7,我们可以利用这个结果。
INT_MIN <= result * 10 + tmp <= INT_MAX
如果任意满足上面的等式说明每轮循环的结果是不会越界的。
tmp 的范围是 0~9,result 有很多可能性
当 result <=( INT_MAX - tmp )/ 10 ,由于INT_MAX的个数位是7,result 的取值范围和tmp有关。

  • 1.当result == INT_MAX /10 ,此时tmp的范围在 0 ~ 7 都ok。
  • 2.当result > INT_MAX / 10 ,此时tmp是啥都不满足了。
  • 3.当result < INT_MAX / 10 ,tmp是啥都没关系。

综上: 我们只需要判断result == INT_MAX / 10和 result > INT_MAX / 10 的情况,但实际上可以用 result > INT_MAX / 10 解决,因为传参的x一定小于INT_MAX,所以当result即将越界,x的最高位 < 2 ,也就是result的尾数是最多是2,所以情况一实际上不需要考虑。

同理: INT_MIN < result * 10 + tmp
(INT_MIN - tmp) / 10 <= result 可以简化为
INT_MIN / 10 <= result ,不满足则说明 result < INT_MIN / 10。

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

你可能感兴趣的:(C++,leetcode,算法,职场和发展)