# 7. Reverse Integer

**<font color=red>难度: Easy</font>**

## 刷题内容

> 原题连接

* https://leetcode.com/problems/reverse-integer/

> 内容描述

```
Given a 32-bit signed integer, reverse digits of an integer.

Example 1:

Input: 123
Output: 321
Example 2:

Input: -123
Output: -321
Example 3:

Input: 120
Output: 21
Note:
Assume we are dealing with an environment which could only store integers within the 32-bit signed integer range: [−231,  231 − 1]. For the purpose of this problem, assume that your function returns 0 when the reversed integer overflows.
```

## 解题方案

> 思路1

翻转数字问题需要注意的就是溢出问题，为什么会存在溢出问题呢，我们知道int型的数值范围是 -2147483648～2147483647(负的2的31次方~2的31次方-1)， 那么如果我们要翻转 1000000009 这个在范围内的数得到 9000000001，而翻转后的数就超过了范围。

如果输入的是负数，就递归调用原函数，参数变成-x即可

```python
class Solution(object):
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        """
        if x < 0:
            return -self.reverse(-x)
        res = 0
        while x:
            res = res * 10 + x % 10
            x /= 10
        return res if res <= 0x7fffffff else 0
```

> 思路2

按照参数正负号先将其转成字符串，然后再反转，根据是否溢出决定输出0还是反转结果

```python
class Solution(object):
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        """    
        x = -int(str(x)[::-1][:-1]) if x < 0 else int(str(x)[::-1])   # [:-1]相当于把负号去掉
        x = 0 if abs(x) > 0x7FFFFFFF else x
        return x
```

> 思路3(StefanPochmann大神)：

看这个解法前先看[backticks](https://docs.python.org/2.7/reference/expressions.html#string-conversions)

cmp函数在python3.x中用不了了，import operator用gt或者lt吧，或者回归if/else condition爸爸的怀抱吧！
```python
class Solution(object):
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        """
        s = cmp(x, 0)
        r = int(`s * x`[::-1])
        return s * r * (r < 2 ** 31)
```

> 思路4

* 1.记录符号
* 2.将数字当字符串处理
* 3.判断是否阈值区间，进行比较就行

```python
class Solution:
    def reverse(self, x):
        """
        :type x: int
        :rtype: int
        """
        mark = 1 if x>=0 else -1
        x_abs = abs(x)
        result = mark * int(str(x_abs)[::-1])
        return result if -2**31 <= result <= 2**31-1 else 0
```
