天天看点

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;

}

};

leetcode7. Reverse Integer

但是,算法效率超级超级低。。。

——————————————————————————————————————————————————————

看了别人的解答。

INT_MAX和INT_MIN可以用来代替那一长串数字。

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