LeetCode_07整数反转

题目描述

给出一个 32 位的有符号整数,你需要将这个整数中每位上的数字进行反转

假设我们的环境只能存储得下 32 位的有符号整数,则其数值范围为 [−2^31, 2^31 − 1]。请根据这个假设,如果反转后整数溢出那么就返回 0。

示例

输入: 123
输出: 321

输入: -123
输出: -321

输入: 120
输出: 21

知识点

  • 数组
  • 逆序输出
  • int溢出

溢出

INT_MAX = 2^31 - 1 =2147483647

INT_MIN= - 2^31 = -2147483648

int类型是32位的,范围是-2147483648到2147483647

上溢是\(INTMAX + 1\) ;

下溢是\(INTMIN - 1\);

如果
\(\text{rev} > \frac{INTMAX}{10}\)
,那么\(temp = \text{rev} \cdot 10 + \text{pop}\)一定会溢出。

如果\(\text{rev} =\frac{INTMAX}{10}\),那么只要\(\text{pop}>7\),那么 \(temp=rev⋅10+p\)就会溢出

解释:\(rev\)是去掉个位数后的最大值即\(214748364\)\(rev·10=2147483640\),所以\(pop>7\)会超过\(INTMAX\)导致溢出;
同理可得\(INTMIN\)

解法

思路一 数组

 
#include <iostream>
using namespace std;
class Solution {
public:
    int reverse(int x) {
        int rev = 0;//rev记载倒置后的数字
        int temp = 0;
        while (x!=0) {
            //pop operation:
            int pop = x % 10;//pop记录x的个位数
            x /= 10;//去掉个位数
            //push operation:
            if (rev > INT_MAX / 10 || (rev == INT_MAX / 10 && pop > 7)) return 0;
            if (rev < INT_MIN / 10 || (rev == INT_MIN / 10 && pop < -8)) return 0;
             temp = rev * 10 + pop;//把pop记录的个位数赋值给temp
            rev = temp;//每次个位数赋值后变为十位(十位变为千位……)可以实现倒置
            
        }
        return rev;

    }
};

int main() {
    Solution solution;
    
    cout << solution.reverse(-123) << endl;
    cout << solution.reverse(120) << endl;
    cout << solution.reverse(123) << endl;
}


思路二 栈

借助栈的性质:先进后出,可以实现将数字逆序
(未尝试)

posted on 2020-03-01 17:24  琢磨亿下  阅读(119)  评论(0编辑  收藏  举报

导航