一、题目描述
输入一个32位有符号整数x,其中x可以小于0、等于0或大于0.输出x的反转,并符合阅读规范。
样例1:输入12345,输出54321.
样例2:输入0,输出0.
样例3:输入-123456,输出-654321.
样例4:输入12345000,输出54321.
样例5:输入-12345000,输出-54321.
二、解题思路
反转一个整数,就是把它每一位上的数存储,再反转。
若x小于0,则返回x绝对值反转后的相反数;若x=0,则反转后还是0.
主要考虑x大于0的情况。用一个长度为32的整型数组存储x每一位上的值,叫做digits[].
然后迭代地取出x每一位上的值(从个位开始),并顺序存入digits中。
其实现在只要输出digits每一个元素的值,就已经基本满足要求了。但考虑到我们这个函数的返回值为整型,所以还是计算一个整型值出来返回。
注意要扫描digits,将最前面的0忽略,这样比较符合我们的阅读习惯,即12345000反转后应为54321,而不是00054321.具体实现过程见下面的代码。
三、C++代码示例
#include <math.h>
#include <stdio.h>
class Solution
{
public:
int reverse(int x)
{
if(x < 0)
{
return -reverse(abs(x));
}
else if(x == 0)
{
return 0;
}
else
{
int i = 0;
int ans = 0;
int digits[32];
while(x > 0)
{
digits[i ++] = x % 10;
x /= 10;
}
for(int j = 0;j < i;j ++)
{
while(digits[j] == 0)
{
continue;
}
ans += digits[j] * pow(10, i - j - 1);
}
return ans;
}
}
};
int main()
{
Solution sol = Solution();
// printf("%d", sol.reverse(12345));
// printf("%d", sol.reverse(0));
// printf("%d", sol.reverse(-12345));
// printf("%d", sol.reverse(12345000));
printf("%d", sol.reverse(-12345000));
return 0;
}
四、其他问题
上述代码可以实现基本功能,即反转一个带符号的整数。思考如何增强鲁棒性,即判断输入是否溢出?若溢出如何处理?等等问题。