题目一:
分析:这题嘛,我们可以从后往前找每一个单词的一个区间范围,然后分割下来,加到答案里面,既然是区间,我们需要两个变量记录,然后还要用一个变量记录字符串是否遍历完,代码如下所示:
class Solution {
public:
string reverseWords(string s) {
string ans;
int k=s.size()-1;
while(k>=0)
{
while(k>=0 && s[k]==' ')
{
--k;
}
int i=k;
while(k>=0 && s[k]!=' ')
{
--k;
}
int j=k;
if(j<i)
{
ans+=s.substr(j+1,i-j);
ans+=" ";
}
}
return ans.substr(0,ans.size()-1);
}
};
结果如下所示:
当然,书里边的思路是这样的,先写一个函数,输入是区间,功能是反转这个区间的字符串。于是总的思路变成先把所有字符串翻转,再从头到尾一个一个单词反转,也是一个可行的办法。
题目二:
分析:这题...可以先看看投机的做法,调库完事了:
class Solution {
public:
string reverseLeftWords(string s, int n) {
int len=s.size();
string ans=s.substr(n);
ans+=s.substr(0,n);
return ans;
}
};
结果如下所示:
当然,我们得学点东西对吧,受到第一题的启发,我们可以这样做,拿s=abcdefg,n=2的题目中的栗子来说,首先我们翻转前两位变成ba,翻转后面的变成gfedc,拼起来bagfedc再翻转,没错,就是答案cdefgab。所以我们要做的是什么呢,要做的是将字符串的两部分分别翻转,然后整个字符串再翻转就好了~代码如下所示:
class Solution {
public:
string reverseLeftWords(string s, int n) {
reverse(s.begin(),s.begin()+n);
reverse(s.begin()+n,s.end());
reverse(s.begin(),s.end());
return s;
}
};
结果如下所示:
这样做有个什么好处呢?我们是只在原字符串上修改,节省了空间的代价~从O(n)降低为O(1)?或许~