From 83bb499e035289a80afc89d2bcc1887991bf514b Mon Sep 17 00:00:00 2001 From: Bauke Date: Wed, 6 Apr 2022 23:08:24 +0200 Subject: [PATCH] Solve roman-to-integer. --- source/lib.rs | 1 + source/roman_to_integer/mod.rs | 44 ++++++++++++++++++++++++++++++++++ 2 files changed, 45 insertions(+) create mode 100644 source/roman_to_integer/mod.rs diff --git a/source/lib.rs b/source/lib.rs index 1ec11ef..5a6e330 100644 --- a/source/lib.rs +++ b/source/lib.rs @@ -2,5 +2,6 @@ pub mod implement_strstr; pub mod longest_common_prefix; pub mod palindrome_number; pub mod reverse_integer; +pub mod roman_to_integer; pub mod two_sum; pub mod valid_parenthesis; diff --git a/source/roman_to_integer/mod.rs b/source/roman_to_integer/mod.rs new file mode 100644 index 0000000..d3ea13e --- /dev/null +++ b/source/roman_to_integer/mod.rs @@ -0,0 +1,44 @@ +pub fn roman_to_int(string: String) -> i32 { + let mut characters = string.chars().peekable(); + let mut number = 0; + + while let Some(character) = characters.next() { + let value = match character { + 'I' => 1, + 'V' => 5, + 'X' => 10, + 'L' => 50, + 'C' => 100, + 'D' => 500, + 'M' => 1000, + _ => panic!("Unknown character: {character}"), + }; + + if let Some(next) = characters.peek() { + let subtract = match next { + 'V' | 'X' if character == 'I' => true, + 'L' | 'C' if character == 'X' => true, + 'D' | 'M' if character == 'C' => true, + _ => false, + }; + + if subtract { + number -= value; + continue; + } + } + + number += value; + } + + number +} + +#[test] +fn test_roman_to_integer() { + assert_eq!(roman_to_int("III".to_string()), 3); + assert_eq!(roman_to_int("LVIII".to_string()), 58); + assert_eq!(roman_to_int("MCMXCIV".to_string()), 1994); + assert_eq!(roman_to_int("XX".to_string()), 20); + assert_eq!(roman_to_int("DCXXI".to_string()), 621); +}