您的位置:首页 > 其它

LeetCode 第 7 题(Reverse Integer)

2016-04-17 19:20 387 查看

LeetCode 第 7 题(Reverse Integer)

题目是这样的:

Reverse digits of an integer.

Example1: x = 123, return 321

Example2: x = -123, return -321

Here are some good questions to ask before coding. Bonus points for you if you have already thought through this!

If the integer’s last digit is 0, what should the output be? ie, cases such as 10, 100.

Did you notice that the reversed integer might overflow? Assume the input is a 32-bit integer, then the reverse of 1000000003 overflows. How should you handle such cases?

For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.

这道题的难度等级被标为 “Easy”, 实际上这道题并不 “Easy”. 难点就在于要考虑整数溢出的问题.

先给个不考虑整数运算溢出问题的代码(实际上,一开始写代码就考虑的太全面的话,会很难下笔。这时不如先写个大概能用的,然后再一步步重构来改善代码):

int reverse(int x)
{
int ret = 0;
do
{
ret = 10 * ret + x % 10;
x = x / 10;
}while(x);
return ret;
}


如何简便的判断运算是否溢出是个难题。我暂时还没找到好办法。不过解决这个问题可以用些变通的方法。比如说我把 x 的每个十进制位的具体数字都记录下来。然后与我算出的结果进行比较,如果对应的位都是对的,那就表示没有溢出。下面是按照这个思路给出的代码。

int reverse(int x)
{
int ret = 0;
int count = 0;
char str[12];
do
{
str[count++] = x % 10;
ret = 10 * ret + x % 10;
x = x / 10;
}while(x);
int ret2 = ret;
while(count > 0)
{
if( ret % 10 != str[--count])
{
return 0;
}
ret = ret / 10;
}
return ret2;
}


还有另外一种思路,既然用 int 型进行计算会溢出,那就选个更大的数据类型,比如 long long,这样不就不溢出了。按照这个思路,有下面的代码:

int reverse(int x)
{
long long ret = 0;
do
{
ret = 10 * ret + x % 10;
x = x / 10;
}while(x);

if(ret > INT_MAX || ret < INT_MIN)
{
return 0;
}
return ret;
}


这个代码比较简洁,对这个问题来说应该是个不错的答案。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: