leetcode: solve problem 13
This commit is contained in:
parent
b03cabc268
commit
615aa114f2
3 changed files with 129 additions and 0 deletions
7
leetcode/0013-roman-to-integer/Cargo.lock
generated
Normal file
7
leetcode/0013-roman-to-integer/Cargo.lock
generated
Normal file
|
@ -0,0 +1,7 @@
|
||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "roman-to-integer"
|
||||||
|
version = "0.1.0"
|
8
leetcode/0013-roman-to-integer/Cargo.toml
Normal file
8
leetcode/0013-roman-to-integer/Cargo.toml
Normal file
|
@ -0,0 +1,8 @@
|
||||||
|
[package]
|
||||||
|
name = "roman-to-integer"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
114
leetcode/0013-roman-to-integer/src/lib.rs
Normal file
114
leetcode/0013-roman-to-integer/src/lib.rs
Normal file
|
@ -0,0 +1,114 @@
|
||||||
|
pub fn roman_to_int(s: String) -> i32 {
|
||||||
|
let mut res = 0;
|
||||||
|
|
||||||
|
let v: Vec<char> = s.chars().collect();
|
||||||
|
let mut check_prev = true;
|
||||||
|
|
||||||
|
for (i, ch) in v.iter().enumerate() {
|
||||||
|
let prev = if i > 0 { v[i - 1] } else { '0' };
|
||||||
|
|
||||||
|
match prev {
|
||||||
|
'I' => match *ch {
|
||||||
|
'V' => {
|
||||||
|
res += 4;
|
||||||
|
check_prev = false;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
'X' => {
|
||||||
|
res += 9;
|
||||||
|
check_prev = false;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
_ => (),
|
||||||
|
},
|
||||||
|
'X' => match *ch {
|
||||||
|
'L' => {
|
||||||
|
res += 40;
|
||||||
|
check_prev = false;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
'C' => {
|
||||||
|
res += 90;
|
||||||
|
check_prev = false;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
},
|
||||||
|
'C' => match *ch {
|
||||||
|
'D' => {
|
||||||
|
res += 400;
|
||||||
|
check_prev = false;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
'M' => {
|
||||||
|
res += 900;
|
||||||
|
check_prev = false;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
_ => {}
|
||||||
|
},
|
||||||
|
_ => (),
|
||||||
|
}
|
||||||
|
|
||||||
|
if check_prev && (prev == 'I' || prev == 'X' || prev == 'C') {
|
||||||
|
res += char_to_int(prev);
|
||||||
|
}
|
||||||
|
|
||||||
|
check_prev = true;
|
||||||
|
|
||||||
|
if *ch != 'I' && *ch != 'X' && *ch != 'C' {
|
||||||
|
res += char_to_int(*ch);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if check_prev {
|
||||||
|
let l = v[v.len() - 1];
|
||||||
|
if l == 'I' || l == 'X' || l == 'C' {
|
||||||
|
res += char_to_int(l);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
res
|
||||||
|
}
|
||||||
|
|
||||||
|
fn char_to_int(c: char) -> i32 {
|
||||||
|
match c {
|
||||||
|
'I' => 1,
|
||||||
|
'V' => 5,
|
||||||
|
'X' => 10,
|
||||||
|
'L' => 50,
|
||||||
|
'C' => 100,
|
||||||
|
'D' => 500,
|
||||||
|
'M' => 1000,
|
||||||
|
_ => 0,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#[cfg(test)]
|
||||||
|
mod tests {
|
||||||
|
use crate::roman_to_int;
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn simple_test() {
|
||||||
|
let result = roman_to_int("III".to_string());
|
||||||
|
assert_eq!(result, 3);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn advanced_test() {
|
||||||
|
let result = roman_to_int("LVIII".to_string());
|
||||||
|
assert_eq!(result, 58);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn sub() {
|
||||||
|
let result = roman_to_int("MCMXCIV".to_string());
|
||||||
|
assert_eq!(result, 1994);
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn simple_sub() {
|
||||||
|
let result = roman_to_int("IX".to_string());
|
||||||
|
assert_eq!(result, 9);
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue