大家好,我树哥
使用Js且对数组API较为熟悉的同学在看到这道题目,肯定会觉得这还不简单?这也算得上中等难度?
- 使用split将其按空格分割成数组
- 来个fitler过滤下空字符串
- 然后再来个reverse反转数组
- 最后来个join, 齐活
直接上代码,只需要一行就可以完美解决
var reverseWords = function(s) {
return s.split(" ").filter(item => item !== "").reverse().join(' ')
};
一段操作猛如虎,确实也通过了lc上的所有用例,数据如下(还不错)
但是这么做,我们不就是调参🦐了嘛,作为一个有追求的程序员,难道我们应该这么做嘛?😄应该,毕竟能解决问题的程序员都是好程序员。
如果不能调用数组原生的API,我们该怎么做呢?(参考代码随想录)
- 去除多余空格
- 翻转整个字符串
- 翻转单个单词
var reverseWords = function(s) {
// 反转
function _reverse(strArr, start, end) {
while (start < end) {
[strArr[start], strArr[end]] = [strArr[end], strArr[start]]
start++
end--
}
}
// 去除空格
let result = Array.from(s)
let slowIndex = 0;
for (let i=0; i<result.length; i++) {
if (result[i] != " ") {
//遇到非空格就处理,即删除所有空格。
if (slowIndex !== 0) result[slowIndex++] = " "; //手动控制空格,给单词之间添加空格。slow != 0说明
while (i < result.length && result[i] != " ") {
//补上该单词,遇到空格说明单词结束。
result[slowIndex++] = result[i++];
}
}
}
// 去除多余长度
result.splice(slowIndex)
// 翻转整个字符串
reverseWords(result, 0, result.length - 1)
let start = 0
let end = 0
while (start < result.length) {
end = start;
while (result[end] !== " " && end < result.length) {
end++;
}
// 翻转单个单词
reverseWords(result, start, end - 1);
start = end + 1;
}
return result.join('');
}
接下来就到了激动人心的提交时刻啦😄,铛铛铛铛铛铛
从这里可以看到调参🦐还是略胜一筹的。
在这里延伸一下数组的定义,主要就是两个点: 连续、相同类型、连续内存。 但是JS 的数组可以存放不同类型的元素、并且数组长度是可变的😄。
从源码来看,JS的数组底层就是个 Map ,key 为0,1,2,3这种索引,value 就是数组的元素。数组的index其实是字符串。