[LeetCode] 7. Reverse Integer 题解

问题描述

给定一个 32 位有符号整数,将每一位的数字反序java

例1:ios

输入:123
输出:321
复制代码

例2:算法

输入:-123
输出:-321
复制代码

例3:bash

输入:120
输出:21
复制代码

注意:spa

假设咱们使用的是 32 位系统,且只能处理 [-2^{31},2^{31}-1] 范围的整数,当出现整型溢出时,你的程序返回 0.net

问题难度

Easy3d

解题思路

首先这道题不适合使用 Python 来作,缘由是面对负数时,Python 的行为与指望不符,例如code

>>> -31/10
-3.1
>>> -31%10
9
复制代码

而使用 C++ 这样的语言,你会获得这样的结果leetcode

int main() {
	cout << "-3 / 10 = " << -3/10 << endl; 
	cout << "-3 % 10 = " << -3%10 << endl; 
}
输出:
-3 / 10 = 0
-3 % 10 = -3
复制代码

能够看到后者比较符合咱们的预期。rem

另外此题的关键在于如何解决整数溢出,思路以下:

整数溢出不能在发生了以后才去判断,而只能在发生溢出以前判断,咱们的算法是,将原数不断除以 10,把获得的余数再不断乘以 10 ,这样就能够将原数「反转」,咱们能够形象的把除以 10 看做是原数的右移,而把乘以 10 看作是新数的左移;既然要在溢出以前判断,那么咱们就须要先将整型的最大值或最小值除以 10,而后将结果和该值进行比较,若是发现进一步操做会发生溢出,则返回 0。

对于正数,咱们知道其最大值是 2^{31}-1=2147483647 ,因此若是结果 y 在下一次「左移」前大于 214748364,那么就必定会发生溢出;特殊状况是 y 在「左移」前等于 214748364,此时还须要判断下一个余数是否超过 7,若是超过,也能够判断其会发生溢出。

同理,负数也能够这样进行判断,这样咱们就能够写出程序了:

#include <iostream>
#include <climits>
using namespace std;

int integer_reverse(long x) {
    int result = 0;
    while (x != 0) {
        int remainder = x % 10;
        x = x / 10;

        if (result > INT_MAX/10 || (result == INT_MAX/10 && remainder > 7)) return 0;
        if (result < INT_MIN/10 || (result == INT_MIN/10 && remainder < -8)) return 0;

        result = result * 10 + remainder;
    }

    return result;
}
复制代码

能够看到,两个 if 语句分别处理正数和负数两种状况,而 if 中的条件就包含了刚才说的两种溢出状况。

原题连接

相关文章
相关标签/搜索