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);

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

如果( ext{rev} =frac{INTMAX}{10}),那么只要( ext{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;
}


思路二 栈

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

原文地址:https://www.cnblogs.com/zhuomoyixia/p/12390849.html