344. 反转字符串
class Solution {
public:
void reverseString(vector<char>& s) {
int len = s.size();
int flag = len / 2;
len--;
for(int i = 0 ; i < flag ;i++)
{
s[i] = s[i] ^ s[len - i];
s[len - i] = s[i] ^ s[len - i];
s[i] = s[i] ^ s[len - i];
}
}
};
没啥好说的,很简单
541. 反转字符串 II
class Solution {
public:
string reverseStr(string s, int k) {
int left = 0;
int right = k - 1;
while(left <= s.size() - 1)
{
if(right > s.size() - 1)
{
right = s.size() - 1;
}
int temp = left;
while(left < right)
{
swap (s[left] , s[right]);
left++;
right--;
}
left = temp + 2 * k;
right = left + k -1;
}
return s;
}
};
双指针,很简单
剑指 Offer 05. 替换空格
class Solution {
public:
string replaceSpace(string s) {
string res;
int flag = 0;
int count = 0;
for(int i = 0 ; i < s.length() ; i++)
{
if(s[i] == ' ')
count += 3;
}
res.resize(s.length() + count);
for(int i = 0 ; i < s.length() ; i++)
{
if(s[i] == ' ')
{
res[flag] = '%';
res[flag + 1] = '2';
res[flag + 2] = '0';
flag += 3;
}
else
{
res[flag] = s[i];
flag++;
}
}
return res;
}
};
151. 反转字符串中的单词
class Solution {
public:
string reverseWords(string s) {
reverse(s.begin() , s.end());
int slow = 0;
int fast = 0;
int temp = 0;
while(s[fast] == ' ')
{
fast++;
}
s[slow] = s[fast];
slow ++;
fast++;
while(fast <= s.length() - 1)
{
if(s[fast] != ' ')
{
s[slow] = s[fast];
slow++;
fast++;
}
else
{
while(s[fast] == ' ' && fast <= s.length() - 1)
{
fast++;
}
if(fast - 1 < s.length() - 1)
{
s[slow] = s[fast - 1];
slow++;
}
}
}
s.resize(slow);
int left = 0;
int right = 0;
while(right < s.length())
{
while(s[right] != ' ' && right < s.length())
{
right++;
}
reverse(s.begin() + left , s.begin() + right );
left = right + 1;
right = left;
}
return s;
}
};
这道题写了真的很久,记录一下思路
首先,这道题还是双指针,但是一开始没看出来,在不开辟新空间的条件下要想用双指针更新数组,条件应该是数组不断缩减。在利用双指针滤除空格之后,要对数组进行反转操作。
一开始没写出来的原因是总想一步完成,就导致了思路不清晰,以后应该分步考虑;
剑指 Offer 58 - II. 左旋转字符串
class Solution {
public:
string reverseLeftWords(string s, int n) {
reverse(s.begin() , s.end());
reverse(s.begin() , s.begin() + s.length() - n);
reverse(s.end() - n, s.end());
return s;
}
};
先整体反转,再局部