diff options
| -rw-r--r-- | 07_reverse-integer/Cargo.lock | 7 | ||||
| -rw-r--r-- | 07_reverse-integer/Cargo.toml | 6 | ||||
| -rw-r--r-- | 07_reverse-integer/src/main.rs | 44 |
3 files changed, 57 insertions, 0 deletions
diff --git a/07_reverse-integer/Cargo.lock b/07_reverse-integer/Cargo.lock new file mode 100644 index 0000000..0719492 --- /dev/null +++ b/07_reverse-integer/Cargo.lock @@ -0,0 +1,7 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "reverse-integer" +version = "0.1.0" diff --git a/07_reverse-integer/Cargo.toml b/07_reverse-integer/Cargo.toml new file mode 100644 index 0000000..23cff3d --- /dev/null +++ b/07_reverse-integer/Cargo.toml @@ -0,0 +1,6 @@ +[package] +name = "reverse-integer" +version = "0.1.0" +edition = "2024" + +[dependencies] diff --git a/07_reverse-integer/src/main.rs b/07_reverse-integer/src/main.rs new file mode 100644 index 0000000..2fb80c4 --- /dev/null +++ b/07_reverse-integer/src/main.rs @@ -0,0 +1,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) + } +} |
