持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情
说明:文章部分内容及图片出自网络,如有侵权请与我本人联系(主页有公众号:小攻城狮学前端)
作者:小只前端攻城狮、 主页:小只前端攻城狮的主页、 来源:掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
【LeetCode 151. 颠倒字符串 】- JavaScript(双指针+API)
题目描述
给你一个字符串 s ,颠倒字符串中 单词 的顺序。
单词 是由非空格字符组成的字符串。s 中使用至少一个空格将字符串中的 单词 分隔开。
返回 单词 顺序颠倒且 单词 之间用单个空格连接的结果字符串。
注意:输入字符串 s中可能会存在前导空格、尾随空格或者单词间的多个空格。返回的结果字符串中,单词间应当仅用单个空格分隔,且不包含任何额外的空格。
示例 1:
输入:s = "the sky is blue" 输出:"blue is sky the"
示例 2:
输入:s = " hello world " 输出:"world hello" 解释:颠倒后的字符串中不能存在前导空格和尾随空格。
双指针遍历翻转
思路分析:
- 首先将字符串转为数组。
- 再利用双指针法将数组中多余空格剔除。即首位和中间的课余空格。
- 再把整个字符串数组先翻转一遍。
- 遍历字符串数组将单个单词进行翻转。
- 最后将翻转后的结果数组转成字符串进行输出。
var reverseWords = function(s) {
const strArr = Array.from(s);
removerExtraSpace(strArr);
reverse(strArr,0,strArr.length-1);
let start = 0;
for(let i = 0;i <= strArr.length;i++) {
if(strArr[i]===' ' || i===strArr.length) {
//翻转单词
reverse(strArr,start,i-1);
start = i + 1;
}
}
return strArr.join('');
};
function removerExtraSpace(strArr) {
let fast = 0;
let slow = 0;
while(fast<strArr.length) {
if(strArr[fast] === ' ' && ( fast===0 || strArr[fast-1]===' ')) {
fast++;
}else{
strArr[slow++] = strArr[fast++];
}
}
strArr.length = strArr[slow-1] === ' ' ? slow - 1 : slow;
}
function reverse(strArr,start,end) {
let l = start;
let r = end;
while(l<r) {
[strArr[l],strArr[r]] = [strArr[r],strArr[l]];
l++;
r--;
}
}
API版本
JavaScript提供了很多关于字符串和数组使用的api,大幅度的提高了我们写代码的效率。这里主要使用的split、filter、reserve和join。几行代码就可以解决我们的问题,思路清晰明了通俗易懂,不累赘。
var reverseWords = function(s) {
return s.split(' ').filter(item => item).reverse().join(' ')
};
注意:虽然api版本的代码少的夸张,但是其实整体的实现思路其实和上面手撸版本是一样的,依旧是先字符串转数组,再去除空格,再对单词反转,最后转回字符串。整体来说,各有好处,具体看什么场景,怎么去使用。
感谢阅读,希望能对你有所帮助,文章若有错误或者侵权,可以在评论区留言或在我的主页添加公众号联系我。
写作不易,如果觉得不错,可以「点赞」+「评论」 谢谢支持❤