[LeetCode]:Reverse Integer(Only两类解法)

来源:互联网 发布:新疆移动4g网络什么时候开通 编辑:程序博客网 时间:2024/06/06 04:03

Reverse digits of an integer.

Example1: x = 123, return 321
Example2: x = -123, return -321


题目大意比较简单,就是把一个整数反转,这个比较容易,但需要注意的是,返转过后,有可能溢出,所以这题的坑就是在溢出这里。

解法一:先把result定义成long long直接翻转,最后看result是不是在int范围内,如果不是返回0.代码如下:

class Solution {public:int reverse(int x) {long long iResult = 0;for (; x; x /= 10)iResult = (iResult << 1) + (iResult << 3) + x % 10;return iResult > INT_MAX || iResult < INT_MIN ? 0 : iResult;}};


解法一的方案是定义一个范围比数据要大的数,反转过后再比较,这方案的弊端在于,如果输入的数的范围变得更大些呢,你long long不能保存的时候就没法了,什么,__int128?。。。嘛..暂时还不行啦.而且内存多了辣么多了。


解法二:这是一种比较科学的解法,我利用x反转的结果再反转一次。看与x是否相等(注意比较的时候要把x末尾的0去掉)。如果相等,说明在int范围内,否则返回0.代码如下:

class Solution {public:int reverse(int x) {int iResult = 0;for (int y = x; y; y /= 10)iResult = (iResult << 1) + (iResult << 3) + y % 10;//x的反转int reverseOfResult = 0;for (int y = iResult; y; y /= 10)reverseOfResult = (reverseOfResult << 1) + (reverseOfResult << 3) + y % 10;//result的反转(x的二次反转)for (; x != 0 && 0 == x % 10; x /= 10);//去掉x末尾的0return reverseOfResult == x ? iResult : 0;}};


发现网上还有一些其他判定范围的解法。


Github: https://github.com/tsfissure/LeetCode


0 0