# 0007. Reverse Integer

{% tabs %}
{% tab title="❓ Problem Statement" %}

> Source: [LeetCode - Reverse Integer](https://leetcode.com/problems/reverse-integer/)\
> GitHub: [Solution / Performance](https://github.com/yylou/leetcode/tree/main/0007-reverse-integer)

Given a signed 32-bit integer `x`, return `x` *with its digits reversed*. If reversing `x` causes the value to go outside the signed 32-bit integer range `[-231, 231 - 1]`, then return `0`.

**Assume the environment does not allow you to store 64-bit integers (signed or unsigned).**
{% endtab %}

{% tab title="✍🏻 Constraints & Example" %}
**Constraints:**

* `-2^31 <= x <= 2^31 - 1`

```
Input: x = 123
Output: 321

Input: x = -123
Output: -321

Input: x = 120
Output: 21

Input: x = 0
Output: 0
```

{% endtab %}
{% endtabs %}

{% tabs %}
{% tab title="💡 Ideas" %}
{% hint style="info" %}

* **Pop and Push Digits** via MOD `%` and DIV `//` operators
* **Check before Overflow**
  {% endhint %}
  {% endtab %}
  {% endtabs %}

{% tabs %}
{% tab title="🤖 Python3" %}

```python
class Solution:
    def reverse(self, x: int) -> int:
        # (base case)
        if x == 0: return x
        
        # ==================================================
        #  Math                                            =
        # ==================================================
        # time  : O(log(n))
        # space : O(1)
        
        ans  = 0
        sign = 1 if x > 0 else -1
        x    = abs(x)
        
        while x:
            pop = x % 10
            x //= 10
            
            ans = ans*10 + pop
            if ans >= 2**31-1: return 0
            
        return sign * ans
```

{% endtab %}

{% tab title="🤖 Java" %}

```java
class Solution {
    /**
     * @time  : O(log(n))
     * @space : O(1)
     */
     
    public int reverse(int x) {
        if( x == 0 ) return x;
        
        int ans = 0;
        
        while( x != 0 ){
            int pop = x % 10;
            x /= 10;
            
            if( ans > Integer.MAX_VALUE/10 || ( ans == Integer.MAX_VALUE / 10 && pop >  7 ) ) return 0;
            if( ans < Integer.MIN_VALUE/10 || ( ans == Integer.MIN_VALUE / 10 && pop < -8 ) ) return 0;
            ans = ans*10 + pop;
        }
        
        return ans;
    }
}
```

{% endtab %}
{% endtabs %}
