1)肯定是先转成string再倒过来。
2)int 表示的范围是 - 2^31 ~ 2^31 - 1,所以倒过来有可能超出范围,不能直接转化成int,而是要做一个判断。
3)反转前要提取出负号,予以保留。
先考虑正数、int范围内的情况吧。参考 https://blog.csdn.net/szu_aker/article/details/52422191 选择了第三种方法——自己编写反转函数。成功地实现了反转。然后对于负数,加个预处理,把符号位去掉。参考 http://blog.sina.com.cn/s/blog_491de9d60100c3bf.html ,用一个while循环去掉输入整数末尾的0。当然,最后要把字符串转成整型输出,参考 http://lib.csdn.net/article/cplusplus/28418 。代码如下:
class Solution {
public:
int reverse(int x) {
cout << x << endl;
stringstream ss;
ss << x;
string s,s_rev;
ss >> s;
int t = 0;
if (s[0] == '-') {
t = 1;
s_rev = "-";
}
auto it = s.end() - 1;
while (*it == '0')
{
s.erase(it);
it -= 1;
}
for (int i = s.length()-1 ; i >= t; i--) {
s_rev += s[i];
}
return atoi(s_rev.c_str());
}
};
最后比较大小,当输入是-12500000000000000时,输出变成了-236561691明显就不对了。把当前代码放进去运行一下,跑出了1027/1032的正确率,剩下的肯定是出界问题没考虑才错的。所以肯定要处理一下的。
传参的时候就有信息丢失,这就很头疼了。算了,先不考虑。只考虑反过来之后越界的情况。是否可以先转成long int再和边界比较呢?结果转成long int后报错unary minus operator applied to unsigned type, result still unsigned。难道只有正数才能比较?于是继续倒腾。无奈,只能把它加上2147483648变成正数再和[0, 4294967296)比较。改完后全部ac!!!
完整代码:
class Solution {
public:
int reverse(int x) {
cout << x << endl;
stringstream ss;
ss << x;
string s,s_rev;
ss >> s;
int t = 0;
if (s[0] == '-') {
t = 1;
s_rev = "-";
}
auto it = s.end() - 1;
while (*it == '0')
{
s.erase(it);
it -= 1;
}
for (int i = s.length()-1 ; i >= t; i--) {
s_rev += s[i];
}
signed long int l = atol(s_rev.c_str());
if ((l + 2147483648 >= 0) && (l + 2147483648 < 4294967296)) {
return l;
}
return 0;
}
};
但是,算法效率超级超级低。。。
——————————————————————————————————————————————————————
看了别人的解答。
INT_MAX和INT_MIN可以用来代替那一长串数字。
代码复制不过来,不写了。