summaryrefslogtreecommitdiff
path: root/07_reverse-integer/src/main.rs
blob: 2fb80c48be08309753c4a94064d0fa0b49fd3807 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
fn main() {
    dbg!(Solution::reverse(1534236469));
}

struct Solution(());

impl Solution {
    pub fn reverse(x: i32) -> i32 {
        let n = if x < 0 { x * -1 } else { x };

        if let Some(i) = Self::invert(n as u32, 0).0 {
            let t: u32 = 1 << 31;

            if (i & t) == t {
                return 0;
            }

            if x < 0 {
                return i as i32 * -1;
            }

            return i as i32;
        }

        0
    }

    fn invert(n: u32, pow: u32) -> (Option<u32>, u32) {
        if n < 10 {
            return (Some(n), pow + 1);
        }

        let m = n % 10;
        let d = (n - m) / 10;
        let c = Self::invert(d, pow);

        if let Some(inner) = c.0
            && let Some(m) = m.checked_mul(10_u32.pow(c.1))
        {
            return (Some(m + inner), c.1 + 1);
        }
        (None, 0)
    }
}