题目描述
给出一个 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;
}
思路二 栈
借助栈的性质:先进后出,可以实现将数字逆序
(未尝试)