Series
1. Readme
系列
给定一串数字,输出所有连续的n
长度顺序子串。
例如,字符串”49142”长度为3
的子串系列:
- “491”
- “914”
- “142”
以下长度为 4
的 系列:
- “4914”
- “9142”
如果你要求一个 5 位数字,长度为 6 的系列,你应该得到原数字。
请注意,这些系列只需要在输入中是相邻的位置; 数字不需要在数字上连续.
资源
Project Euler 中,问题 8 的一个子集http://projecteuler.net/problem=8
2. 开始你的表演
pub fn series(digits: &str, len: usize) -> Vec<String> { unimplemented!( "What are the series of length {} in string {:?}", len, digits ) }
3. 测试代码查看
# #![allow(unused_variables)] #fn main() { #[test] fn test_with_zero_length() { let expected = vec!["".to_string(); 6]; assert_eq!(series("92017", 0), expected); } #[test] //#[ignore] fn test_with_length_2() { let expected = vec![ "92".to_string(), "20".to_string(), "01".to_string(), "17".to_string(), ]; assert_eq!(series("92017", 2), expected); } #[test] //#[ignore] fn test_with_numbers_length() { let expected = vec!["92017".to_string()]; assert_eq!(series("92017", 5), expected); } #[test] //#[ignore] fn test_too_long() { let expected: Vec<String> = vec![]; assert_eq!(series("92017", 6), expected); } #}
4. 答案
# #![allow(unused_variables)] #fn main() { pub fn series(digits: &str, len: usize) -> Vec<String> { match len { 0 => vec!["".to_string(); digits.len() + 1], _ => digits .chars() .collect::<Vec<char>>() .windows(len) .map(|window| window.into_iter().collect::<String>()) .collect::<Vec<String>>(), } } #}