LeetCode 整数反转(C++)
题目:
给你一个 32 位的有符号整数 x ,返回将 x 中的数字部分反转后的结果。
如果反转后整数超过 32 位的有符号整数的范围 [−2^31 , 2^31− 1] ,就返回 0。
假设环境不允许存储 64 位整数(有符号或无符号)。
示例:
输入:x = 123
输出:321
输入:x = -123
输出:-321
输入:x = 120
输出:21
最初尝试(失败):
class Solution {
public:
int reverse(int x) {
if(x==0) {
return 0; //如果x为0则直接返回0
}
string s = to_string(x); //将x从int转变为string赋值为s
int n = s.size();
int i = x < 0 ? 1 : 0; //若x为负则i为1否则为0
int j = n-1;
for( ; i<=j ; i++ , j-- ){ //交换
char temp = s[i];
s[i] = s[j];
s[j] = temp;
}
x = atoi(s.c_str()); //将s从string转变为int赋值为int
return x;
}
};
利用了int转字符串后反转再转int,结果显示溢出时未返回0。
修正代码(成功):
查阅了一下官方发布的答案以及评论区,学会了几种方法如下所示。
- 利用异常捕捉实现溢出时返回值为0(个人最喜欢),缺点是消耗的空间与时间都比较大。
class Solution {
public:
int reverse(int x) {
string s=to_string(x);//变成字符串
std::reverse(s.begin(), s.end());//翻转字符串,改进了上面那个冗杂的翻转
int res=0;
try{
res=stoi(s);//将翻转后的字符串变为int
if (x<0) res=-res;//x是负数,加上负号
}catch(exception ex){}//溢出,捕捉异常返回零
return res;
}
};
2.利用弹出与推入操作,运行时间大大缩减。(INT_MAX 为2^31 ,INT_MIN为-2^31+1)
class Solution {
public:
int reverse(int x) {
int ans = 0;
while(x){ //若x为0则退出循环
if(x > 0 && ans > (INT_MAX - x % 10) / 10) return 0;
if(x < 0 && ans < (INT_MIN - x % 10) / 10) return 0;
ans = ans * 10 + x % 10; //x弹出尾数后 ans推入
x /= 10;
}
return ans;
}
};