[LeetCode] 7. Reverse Integer 题解

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

内容简介:给定一个 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 中的条件就包含了刚才说的两种溢出情况。

原题链接


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

查看所有标签

猜你喜欢:

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

机器学习

机器学习

周志华 / 清华大学出版社 / 2016-1-1 / 88.00元

机器学习是计算机科学与人工智能的重要分支领域. 本书作为该领域的入门教材,在内容上尽可能涵盖机器学习基础知识的各方面。 为了使尽可能多的读者通过本书对机器学习有所了解, 作者试图尽可能少地使用数学知识. 然而, 少量的概率、统计、代数、优化、逻辑知识似乎不可避免. 因此, 本书更适合大学三年级以上的理工科本科生和研究生, 以及具有类似背景的对机器学 习感兴趣的人士. 为方便读者, 本书附录给出了一......一起来看看 《机器学习》 这本书的介绍吧!

SHA 加密
SHA 加密

SHA 加密工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HSV CMYK 转换工具
HSV CMYK 转换工具

HSV CMYK互换工具