拿到这道题,我们想一下,我们将整个字符串都反转过来,那么单词的顺序指定是倒序了,只不过单词本身也倒序了,那么再把单词反转一下,单词不就正过来了。
所以解题思路如下:
移除多余空格
将整个字符串反转
将每个单词反转
举个例子,源字符串为:”the sky is blue “
移除多余空格 : “the sky is blue”
字符串反转:”eulb si yks eht”
单词反转:”blue is sky the”
这样我们就完成了翻转字符串里的单词。
那么现在的思路就非常清晰明了了,先将整个字符串进行反转,再去除多余的空格,最后将每个单词进行反转
以下我对最难的部分—移除多余的空格进行讲解:
我们可以采用双指针的思想进行移除多余空格的操作,快指针用来遍历我们的数组,慢指针用于更新我们需要保留的元素的索引
不过有一个逻辑需要特别处理一下,就是要在每个单词之间加上空格(首单词除外)——判断逻辑可以表示为
if(slow!=0) s[slow++]=’ ‘;
这样就可以做到在每个单词之间加上空格,并且去除首字母前面的空格了。
具体函数实现的代码如下:
//去除字符串中多余的空格
void removeExtraSpaces(string& s)
{
int fast = 0, slow = 0;
for (fast = 0; fast < s.size(); fast++) {
//快指针指向我们要保留的字符
if (s[fast] != ' ') {
//将每个单词之间加上空格,首单词除外
if (slow != 0) s[slow++] = ' ';
//将单词中间的空格去除
while (fast < s.size() && s[fast] != ' ') {
s[slow++] = s[fast++];
}
}
}
s.resize(slow);
}
其余两个步骤的代码比较简单,我在这里就不过多赘述了
具体可以编译运行的代码如下:
class Solution {
public:
//反转字符串中的某段
void reverse(string& s, int start, int end)
{
for (int i = start, j = end; i < j; i++, j--) {
swap(s[i], s[j]);
}
}
//去除字符串中多余的空格
void removeExtraSpaces(string& s)
{
int fast = 0, slow = 0;
for (fast = 0; fast < s.size(); fast++) {
//快指针指向我们要保留的字符
if (s[fast] != ' ') {
//将每个单词之间加上空格,首单词除外
if (slow != 0) s[slow++] = ' ';
//将单词中间的空格去除
while (fast < s.size() && s[fast] != ' ') {
s[slow++] = s[fast++];
}
}
}
s.resize(slow);
}
string reverseWords(string& s)
{
//移除字符串中多余的空格
removeExtraSpaces(s);
//反转这个字符串
reverse(s, 0, s.size() - 1);
//反转这个字符串中的每一个单词
int start = 0;
for (int i = 0; i <= s.size(); i++) {
if ( i == s.size()||s[i]==' ') {
reverse(s, start, i - 1);
start = i + 1;
}
}
return s;
}
};
1.本站内容仅供参考,不作为任何法律依据。用户在使用本站内容时,应自行判断其真实性、准确性和完整性,并承担相应风险。
2.本站部分内容来源于互联网,仅用于交流学习研究知识,若侵犯了您的合法权益,请及时邮件或站内私信与本站联系,我们将尽快予以处理。
3.本文采用知识共享 署名4.0国际许可协议 [BY-NC-SA] 进行授权
4.根据《计算机软件保护条例》第十七条规定“为了学习和研究软件内含的设计思想和原理,通过安装、显示、传输或者存储软件等方式使用软件的,可以不经软件著作权人许可,不向其支付报酬。”您需知晓本站所有内容资源均来源于网络,仅供用户交流学习与研究使用,版权归属原版权方所有,版权争议与本站无关,用户本人下载后不能用作商业或非法用途,需在24个小时之内从您的电脑中彻底删除上述内容,否则后果均由用户承担责任;如果您访问和下载此文件,表示您同意只将此文件用于参考、学习而非其他用途,否则一切后果请您自行承担,如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。
5.本站是非经营性个人站点,所有软件信息均来自网络,所有资源仅供学习参考研究目的,并不贩卖软件,不存在任何商业目的及用途
暂无评论内容