1
Fork 0

Solve roman-to-integer.

This commit is contained in:
Bauke 2022-04-06 23:08:24 +02:00
parent bb5741755e
commit 83bb499e03
Signed by: Bauke
GPG Key ID: C1C0F29952BCF558
2 changed files with 45 additions and 0 deletions

View File

@ -2,5 +2,6 @@ pub mod implement_strstr;
pub mod longest_common_prefix; pub mod longest_common_prefix;
pub mod palindrome_number; pub mod palindrome_number;
pub mod reverse_integer; pub mod reverse_integer;
pub mod roman_to_integer;
pub mod two_sum; pub mod two_sum;
pub mod valid_parenthesis; pub mod valid_parenthesis;

View File

@ -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);
}