给定一个 32 位有符号整数,将整数中的数字进行反转。
示例 1:
输入: 123 输出: 321
示例 2:
输入: -123 输出: -321
示例 3:
输入: 120 输出: 21
注意:
假设我们的环境只能存储 32 位有符号整数,其数值范围是 [−231, 231 − 1]。根据这个假设,如果反转后的整数溢出,则返回 0。
感觉leetcode和pat不一样的地方在于不能钻printf 的空子.....说怎样返回就得按顺序放数组里返回
注意点:
1 溢出的判断:设置了边界值MAX和MIN
2 负号“-”的处理:反转之后删掉末尾的,加到首位(应该有许多更简单的办法)
3 末尾0的处理 atoi函数自己处理了
提交代码
class Solution {
public:
int reverse(int x) {
int MAX = 0x7fffffff;
int MIN = 1 << 31;
ostringstream stream,smax,smin;
string ss;
stream << x;
ss += stream.str();
smax << MAX;
string max_num = smax.str();
smin << MIN;
string min_num = smin.str();
std::reverse(ss.begin(),ss.end());
if(x<0){//处理负数的“-”
ss.insert(0,"-");
ss.pop_back();
}
if(x > 0 && ss.size() >= max_num.size() && (ss > max_num)) return 0;//上溢
else if(x < 0 && ss.size() >= min_num.size() && ss > min_num) return 0;//下溢
else return atoi(ss.c_str());
}
};
调试代码
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<sstream>
using namespace std;
int main(){
int x;
int MAX = 0x7fffffff;
int MIN = 1 << 31;
scanf("%d",&x);
ostringstream stream,smax,smin;
string ss;
stream << x;
ss += stream.str();
smax << MAX;
string max_num = smax.str();
smin << MIN;
string min_num = smin.str();
std::reverse(ss.begin(),ss.end());
if(x<0){
ss.insert(0,"-");
ss.pop_back();
}
//compare with string
printf("%s\n",ss.c_str());
printf("%s\n",min_num.c_str());
if(x > 0 && ss.size() >= max_num.size() && (ss > max_num)) printf("01\n");//return 0 上溢
else if(x < 0 && ss.size() >= min_num.size() && (ss > min_num)) printf("02\n");//下溢
printf("%d",atoi(ss.c_str()));
}