151. 反转字符串中的单词
题目描述
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
解题思路
不能用库函数自己写的话还是有点烦,但是不难
#![allow(unused)] fn main() { struct Solution {} impl Solution { // O(1) space O(n) time pub fn reverse_words(s: String) -> String { let mut v: Vec<char> = vec![]; for c in s.chars().rev() { if c == ' ' { let a = v.last(); if a.is_none() { continue } if *a.unwrap() == ' ' { continue } } v.push(c); } if v[v.len() - 1] == ' ' { v.pop(); } // reverse each word let mut start = 0; while start < v.len() { let mut end = start + 1; while end < v.len() && v[end] != ' ' { end += 1 } Self::reverse(&mut v[start..end]); start = end + 1; } v.iter().collect() } pub fn reverse(s: &mut [char]) { let n = s.len(); for i in 0..n/2 { let tmp = s[i]; s[i] = s[n-1-i]; s[n-1-i] = tmp; } } } }
学习感想
#![allow(unused)] fn main() { struct Solution {} impl Solution { pub fn reverse_words(s: String) -> String { s.split_ascii_whitespace().rev().collect::<Vec<&str>>().join(" ") // ^ String -> &str // ^ iter Target=&str ^ Vec<&str> } } }