Leetcode151 翻转字符串里的单词
题目链接:翻转字符串里的单词
文章链接:代码随想录-翻转字符串里的单词
代码:
class Solution {
public:
void my_reverse(string& s, int start, int end)
{
int left = start;
int right = end;
for(;left < right; left++,right--)
{
char temp = s[left];
s[left] = s[right];
s[right] = temp;
}
}
void removespace(string& s)
{
int slow= 0;
int fast= 0;
int len = s.size();
for(;fast < len; fast++)
{
if(s[fast] != ' ')
{
if(slow != 0) s[slow++] = ' ';
while(fast < len && s[fast] != ' ')
{
s[slow] = s[fast];
slow++;
fast++;
}
}
}
s.resize(slow);
}
string reverseWords(string s) {
removespace(s);
my_reverse(s,0,s.size()-1);
int len = s.size();
int temp = 0;
for(int i = 0; i<= len; i++) // 设置等于号是有玄机的!!!
{
if(s[i] == ' ' || i == len )
{
my_reverse(s,temp,i-1);
temp = i + 1;
}
}
return s;
}
};
思路分析
使用双指针的方法去处空格,这里有几个细节之处:
1. 开头处的连续空格都要去掉;
2. 第一个单词除外,每一个单词前面都有一个空格
上面这两件事需要额外处理一下,注意代码中的removespace函数。
去掉空格后,采取的措施是先将整个字符串反转,再依次翻转每一个字符。
卡码网55 右转字符串
题目链接:右旋转字符串
文章链接:代码随想录-右旋转字符串
代码:
#include<iostream>
using namespace std;
#include<cstring>
void my_reverse(string& s, int start, int end)
{
int left = start;
int right = end;
for(;left < right;left++, right--)
{
char temp = s[left];
s[left] = s[right];
s[right] = temp;
}
}
int main()
{
int k;
string s;
cin>>k;
cin>>s;
my_reverse(s,0,s.size()-1);
my_reverse(s,0,k - 1);
my_reverse(s,k,s.size()-1);
cout<<s;
return 0;
}
思路分析
翻转字符串一个一个处理比较困难,一般思路是整体翻转,然后再处理部分翻转。
双指针
双指针有如下用法:
1. 删除数组、字符串元素,提高效率,节省空间;
2. 用来遍历,一般是涉及到同一个数组或字符串中的多元素的便利,减少不必要的冗余便利;
3. 用于链表中的环的判断以及环的寻找;
4. 链表的翻转等操作也是可以使用双指针,这与数组、字符串的修改是一致的。
综上,双指针的有点在于效率高、节省空间,避免冗余。