Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
题目描述
给定一个字符串 s ,你需要反转字符串中每个单词的字符顺序,同时仍保留空格和单词的初始顺序。
示例 1:
输入: s = "Let's take LeetCode contest"
输出: "s'teL ekat edoCteeL tsetnoc"
示例 2:
输入: s = "God Ding"
输出: "doG gniD"
提示:
- 1 <= s.length <= 5 * 104
- s 包含可打印的 ASCII 字符。
- s 不包含任何开头或结尾空格。
- s 里 至少 有一个词。
- s 中的所有单词都用一个空格隔开。
题解
1.暴力解法
通过 js 中的 字符串的分割 split 方法 和 数组的 reverse 和 join 方法 来进行处理。
先将字符串 通过空格进行分割,得到每个单词的数组。
之后再遍历每个单词,将每个字符进行分割后 得到新的数组,再将数组进行翻转,最后合并数组得到 单个翻转后的单词
最后我们将数组内,每个翻转后的单词 合并起来,即可得到结果。
此方法为暴力破解,并不是一个常规的算法型的方式 来解的。
const reverseWords = (s) => {
const sSplit = s.split(' ')
const newSplit = sSplit.map((item) => {
return item.split('').reverse().join('')
})
return newSplit.join(' ')
}
2.通过双指针算法来处理
记录开始位置,只要遇到空格 就 反向 push 到数组中。
let reverseWords = s => {
let res = [];
let i = 0;
while(i < s.length){
let start = i;
while(i < s.length && s[i] !== ' ') i++; // 未遇到空格,i一直往前走
for(let t = i - 1; t >= start; t--){ //从上面while出来,表明走出一个完整的单词了
res.push(s[t]); //将单词的字符倒着放入res中
}
while(i < s.length && s[i] == ' ') {
i++;
res.push(' '); // 添加字符间的空格
}
}
return res.join('');
}
总结
该题目 4,出现了很多技巧点及好的思路。而且要对js的相关方法要有熟练记忆和使用。