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