题目
输入一个英文句子,翻转句子中单词的顺序,但单词内字符的顺序不变。为简单起见,标点符号和普通字母一样处理。例如输入字符串"I am a student. ",则输出"student. a am I"。
解析
数组解法
这题较为简单,通过将字符串转换为数组,把数组反转后,再拼接成字符串即可。
具体步骤如下:
- 先对字符串
s执行trim方法,去除左右空格 - 对字字符串
s.split(" ")执行按空格分割为数组 - 使用
filter过滤数组中为空的元素 - 最后通过数组的
join(" ")方法转换为字符串
字符串遍历解法
从后往前遍历字符串s 的每一个字符,如果是" "就跳过,反之则保留。
具体步骤如下:
- 声明
res字符串保存反转后的结果 - 声明
i = s.length-1指向字符串末尾字符,从后往前扫描每一个字符, - 如果当前字符是
' ',i--继续向前扫描 - 声明
word保存遍历中的单词, 当前字符不为' ', 拼接到word上,i--继续向前扫描 - 当字符为
' '时,word + ' '拼接到res上,继续下一轮循环 - 当
i < 0时, 说明遍历结束,终止循环,返回结果res.trim(), 因为最后一个单词多拼了一个空格
参考代码
使用数组API
/**
* @param {string} s
* @return {string}
*/
var reverseWords = function(s) {
return s.trim().split(" ").filter(v => !!v).reverse().join(" ");
};
字符串遍历
/**
* @param {string} s
* @return {string}
*/
var reverseWords = function(s) {
// 声明res 字符串保存反转后的结果
let res = "";
let i = s.length - 1;
// 从后往前遍历
while(i >= 0) {
// 如果当前字符是' ', i-- 指针一直向前走
while(s[i] && s[i] === ' ') {
i--;
}
// 用word 保存单词
let word = '';
// 当前字符存在,且不为 ' ', 拼接到word上, 指针继续向前走
while(s[i] && s[i] !== ' ') {
word = s[i] + word;
i--;
}
// 当前单词添加空格
word += ' ';
// 添加当前单词到结果
res += word;
}
// 由于最后一个单词多拼了一个 ' ', 所以trim 去除
return res.trim();
};