LeetCode344.反转字符串
思路:定义左右指针,左指针left指向s[0],右指针right指向s[s.size() - 1],然后交换两个元素,交换后left++,right--。
代码:
class Solution {
public:
void reverseString(vector<char>& s) {
int left = 0;
int right = s.size() - 1;
while(right >= left)
{
char temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
};
LeetCode541.反转字符串 ||
题目:541. 反转字符串 II - 力扣(LeetCode)
思路:
每次跳2k个,i += 2k
代码:
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]);
}
}
string reverseStr(string s, int k) {
for(int i = 0; i < s.size() - 1; i += (2*k))
{
//如果剩余字符小于2k但是大于等于k个,则反转前k个字符
//剩余字符计算公式:s.size() - 1 - i + 1 >= k ==>> i + k <= s.size()
if(i + k <= s.size())
{
reverse(s, i, i + k - 1);
continue;
}else//如果剩余字符少于k个,则将剩余字符全部反转,即i + k > s.size()
{
reverse(s, i, s.size() - 1);
}
}
return s;
}
};
LeetCode 剑指offer 05.替换空格
题目:剑指 Offer 05. 替换空格 - 力扣(LeetCode)
思路:
首先扩充数组到每个空格替换成"%20"之后的大小。然后从后向前替换空格,也就是双指针法,过程如下:i指向新长度的末尾,j指向旧长度的末尾。从后向前填充元素,避免了从前向后填充元素时,每次添加元素都要将添加元素之后的所有元素向后移动的问题。
代码:
class Solution {
public:
string replaceSpace(string s) {
int count = 0;
int oldSize = s.size();
for(int i = 0; i < s.size(); i++)
{
if(s[i] == ' ')
{
count++;
}
}
s.resize(s.size() + count * 2);//%20占3个字节,空格占一个字节,所以需要把数组增加count * 2个长度
int newSize = s.size();
//从后往前将空格替换成%20
for(int i = newSize - 1, j = oldSize - 1; j < i; i--, j--)
{
if(s[j] != ' ')
{
s[i] = s[j];
}
else
{
s[i] = '0';
s[i - 1] = '2';
s[i - 2] = '%';
i -= 2;
}
}
return s;
}
};