diff --git a/src/problem/mod.rs b/src/problem/mod.rs index 5475797..20f64ff 100644 --- a/src/problem/mod.rs +++ b/src/problem/mod.rs @@ -698,3 +698,5 @@ mod p1061_lexicographically_smallest_equivalent_string; mod p2434_using_a_robot_to_print_the_lexicographically_smallest_string; mod p3170_lexicographically_minimum_string_after_removing_stars; + +mod p386_lexicographical_numbers; diff --git a/src/problem/p386_lexicographical_numbers.rs b/src/problem/p386_lexicographical_numbers.rs new file mode 100644 index 0000000..af1ac0c --- /dev/null +++ b/src/problem/p386_lexicographical_numbers.rs @@ -0,0 +1,50 @@ +/** + * [386] Lexicographical Numbers + */ +pub struct Solution {} + +// submission codes start here + +impl Solution { + pub fn lexical_order(n: i32) -> Vec { + let mut result = Vec::with_capacity(n as usize); + + for i in 1..10 { + Self::search(&mut result, i, n); + } + + result + } + + fn search(result: &mut Vec, mut prefix: i32, n: i32) { + if prefix <= n { + result.push(prefix); + } + + prefix = prefix * 10; + + for i in 0..10 { + if prefix + i > n { + break; + } + + Self::search(result, prefix + i, n); + } + } +} + +// submission codes end + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_386() { + assert_eq!(vec![1, 2], Solution::lexical_order(2)); + assert_eq!( + vec![1, 10, 11, 12, 13, 2, 3, 4, 5, 6, 7, 8, 9], + Solution::lexical_order(13) + ); + } +}