[LeetCode] 7. Reverse Integer 题解

栏目: 编程工具 · 发布时间: 5年前

内容简介:给定一个 32 位有符号整数,将每一位的数字反序注意:假设我们使用的是 32 位系统,且只能处理 范围的整数,当出现整型溢出时,你的程序返回 0

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

例1:

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

例2:

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

例3:

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

注意:

假设我们使用的是 32 位系统,且只能处理 范围的整数,当出现整型溢出时,你的程序返回 0

问题难度

Easy

解题思路

首先这道题不适合使用 Python 来做,原因是面对负数时,Python 的行为与期望不符,例如

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

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

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

可以看到后者比较符合我们的预期。

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

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

对于正数,我们知道其最大值是 ,所以如果结果 在下一次「左移」前大于 214748364,那么就一定会发生溢出;特殊情况是 在「左移」前等于 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 中的条件就包含了刚才说的两种溢出情况。

原题链接


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

JavaScript & jQuery

JavaScript & jQuery

David Sawyer McFarland / O Reilly / 2011-10-28 / USD 39.99

You don't need programming experience to add interactive and visual effects to your web pages with JavaScript. This Missing Manual shows you how the jQuery library makes JavaScript programming fun, ea......一起来看看 《JavaScript & jQuery》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码