这是算法学习的第一天,今天学习的是 leetcode
剑指offer 58 -1,坚持就是胜利。
C++
题解
看到题目的第一眼,双指针 的方法就出现在我的脑海,但是由于前后的空格,实现的过程并不顺利。
class Solution {
public: string reverseWords(string s) {
int n = s.size();
int i = n-1,j=n-1;
string res;
int k = 0;
while(s[k] == ' ') k++;
while(i>=k){
while(i>=k&&s[i] == ' ') { i--;j--; }
while(i>=k&&s[i] != ' ') i--;
res+=s.substr(i+1,j-i);
if(i>=k) res+=' '; j=i;
}
return res;
}
};
实现的思路也是非常的简单:(这里以示例2为例)
然后看到了官方的解法。
class Solution {
public: string reverseWords(string s) {
reverse(s.begin(),s.end());
int idx = 0,i; int n = s.size();
for(i=0;i<n;i++){
if(s[i] != ' '){
if(idx != 0) s[idx++] = ' ';
int j = i;
while(s[j] != ' ' && j<n) s[idx++] = s[j++];
reverse(s.begin()+idx-(j-i),s.begin()+idx);
i = j;
}
}
s.erase(s.begin()+idx,s.end());
return s;
}
};
官方是在原本的字符串上直接进行操作,引用了一个变量 idx 进行标记。
reverse函数
值得注意的是,这里的
begin指的是第一个元素,但是end是最后一个元素的下一个元素。
substr函数
erase函数
JavaScript
题解
/**
* @param {string} s
* @return {string}
*/
var reverseWords = function(s) {
return s.trim().split(/\s+/).reverse().join(' ');
};
这里纯粹就是 JavaScript 的API了
trim函数
split函数
JavaScript split() 方法 | 菜鸟教程 (runoob.com)
结语
算法小白的算法笔记。
文章如果有不正确的地方,欢迎指正,共同学习,共同进步。
若有侵权,请联系作者删除。