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()
    }
}
}