「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战」
344. 反转字符串
题目描述
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。
示例 1:
输入: s = ["h","e","l","l","o"]
输出: ["o","l","l","e","h"]
示例 2:
输入: s = ["H","a","n","n","a","h"]
输出: ["h","a","n","n","a","H"]
双指针法
题述中原地修改数组,所以就可以考虑使用双指针来解题
class Solution
{
public:
void reverseString(vector<char> &s)
{
int left = 0, right = s.size() - 1;
while (left < right)
{
char tmp = s[left];
s[left] = s[right];
s[right] = tmp;
left++;
right--;
}
}
};
541. 反转字符串 II
题目描述
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
- 如果剩余字符少于
k个,则将剩余字符全部反转。 - 如果剩余字符小于
2k但大于或等于k个,则反转前k个字符,其余字符保持原样。
示例 1:
输入: s = "abcdefg", k = 2
输出: "bacdfeg"
示例 2:
输入: s = "abcd", k = 2
输出: "bacd"
思路
- 设置索引,每次移动2k步
- 判断剩余的字符是否大于k,大于k的话是否大于2k,将满足条件的反转
- 将剩余的小于k个的字符进行反转
代码
自己实现reverse函数
class Solution1
{
public:
// 自己实现reverse算法
void myReverse(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(); i += (2 * k))
{
//1、每2k个字符中反转前k个字符
//2、剩余的字符大于k但是小于2k,反转前k个
if (i + k <= s.size())
{
myReverse(s, i, i + k - 1);
continue;
}
//3、剩余的小于k个的字符全部反转
myReverse(s, i, s.size() - 1);
}
return s;
}
};
调用库函数 reverse
class Solution
{
public:
string reverseStr(string s, int k)
{
for (int i = 0; i < s.size(); i += (2 * k))
{
//1、每2k个字符中反转前k个字符
//2、剩余的字符大于k但是小于2k,反转前k个
if (i + k <= s.size())
{
// 反转前k个字符
reverse(s.begin() + i, s.begin() + i + k);
continue;
}
//3、剩余的字符数量小于k,则全部反转
reverse(s.begin() + i, s.begin() + s.size());
}
return s;
}
};