leetcode7. Reverse Integer

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可以用来代替那一长串数字。

代码复制不过来,不写了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值