541. 反转字符串 II
题目描述
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
解题思路
#![allow(unused)] fn main() { struct Solution {} impl Solution { pub fn reverse_str(s: String, k: i32) -> String { let s = s.chars().collect::<Vec<char>>(); let mut v: Vec<char> = vec![]; let mut rev = true; for i in s.chunks(k as usize) { if rev { v.extend(i.iter().rev()); } else { v.extend(i); } rev = !rev; } v.iter().collect() } } }
type system好优雅,真的优雅,真的好优雅,
slice是实现std::iter::DoubleEndedIterator
的,所以可以reverse,iter返回的不是不同的迭代器而是std::slice::Iter
Vec是实现Extend
trait的,所以可以用slice的copy_from_slice
实现extend
学习感想
#![allow(unused)] fn main() { struct Solution {} impl Solution { pub fn reverse_str(s: String, k: i32) -> String { let mut s: Vec<u8> = s.bytes().collect(); let mut i: usize = 0usize; loop { let start: usize = i * k as usize * 2usize; if start >= s.len() { break } i += 1usize; let end: usize = std::cmp::min(start + k as usize, s.len()); s[start .. end].reverse() } String::from_utf8(s).unwrap() } } }