这是跟着代码随想录的顺序学习算法的第十天。
以下是学习时自己的一些理解与笔记,如有错误欢迎指正与讨论。
151. 翻转字符串里的单词
参考相关链接:
笔记
代码随想录中的思路,二刷的时候试试自己写一遍。
移除多余空格
将整个字符串反转
将每个单词反转
我做本题的主要思路是用双指针 right 和 left 来,从后往前历遍,按顺序找出每个 单词 ,然后放到新的数组 resArr 中,最后再合成字符串。
历遍的详细过程为,先让 right 指针从 s.length - 1 出发,找到第一个 非空格元素 时停下,
让 left 指针从 right 当前的位置出发往前历遍,找到这个方向上 **最近的一个 空格元素 ** 或者到索引下标为 0 时停止,
此时通过 left 和 right 就可以确定这个单词的首字母与尾字母的索引下标,接着,就可以将其 “提出来” 放到新数组 resArr 中,
然后再让 right 从 left 的位置开始继续下一个循环。
值得一提的是,
JS的中的数组索引下标超出其长度时,会是undefined而非像C++那样会报错,当数组的方法push(undfined)时,undefined也将会是一个数组元素。数组用resArr.join('')进行拼接的时候,会直接略过undefined。而当
join()的参数变化时,undefined不会被无视。const elements = [1, 2,'a',undefined, 3]; console.log(elements.join()); // 1,2,a,,3 console.log(elements.join('')); // 12a3 console.log(elements.join('-')); // 1-2-a--3
**警告:**如果一个元素为
undefined或null,它会被转换为空字符串。
/**
* @param {string} s
* @return {string}
*/
var reverseWords = function(s) {
const resArr = [];
let right = s.length - 1;
let left = right;
while (right >= 0) {
if (s[right] !== ' ') {
left = right;
while (left >= 0 && s[left] !== ' ') left--;
// s[left + 1] 至 s[right] 非空格
if (resArr.length !== 0) resArr.push(' ');
let temp = right - left;
while (temp > 0) {
// s的索引超出s.length - 1后,
// 会是undefined,而不会报错!
resArr.push(s[right - temp + 1]);
temp--;
}
right = left;
}
right--;
}
return resArr.join('');
};
这篇博客记录了作者在学习算法过程中,针对151题——翻转字符串里的单词的问题,采用双指针法进行解决的过程。文中详细阐述了如何利用左右两个指针从后往前找到每个单词,并将其反转并存入新数组,最终再将数组拼接成字符串。还提到了JavaScript中数组处理undefined的情况,并给出了一段实现代码。
556

被折叠的 条评论
为什么被折叠?



