(写给未来遗忘的自己)
344.反转字符串
方法一:自己写内部实现
class Solution {
public:
void reverseString(vector<char>& s) {
int first_ptr=0;
int last_ptr=s.size()-1;
while(first_ptr<last_ptr){
swap(s[first_ptr],s[last_ptr]);
first_ptr++;
last_ptr--;
}
}
};
注意:
整体简单,就是利用双指针,一个从前往后,一个从后往前,将当前两个下标对应的数据直接交换(利用swap())
循环条件就是first_ptr<last_ptr 就可以,如果奇数,中间一个数,first_ptr=last_ptr时候跳出循环,不需要交换;如果偶数就是first_ptr>last_ptr的时候跳出循环.
方法二:(调用C++的反转函数reverse)
class Solution {
public:
void reverseString(vector<char>& s) {
reverse(s.begin(),s.end());
}
};
541.反转字符串Ⅱ
class Solution {
public:
string reverseStr(string s, int k) {
string reverse_s = s;
int size_s = reverse_s.size();
int n = size_s / k; // 完整k段的数量
int remainder = size_s % k; // 剩余不满k的部分
for (int i = 0; i <= n; ++i) {
int start = i * 2 * k; // 2k为一组,反转前k个字符
int end = std::min(start + k, size_s); // 确保不超出字符串范围
if (start < size_s) {
reverse(reverse_s.begin() + start, reverse_s.begin() + end);
}
}
return reverse_s;
}
};
注意:
在C++中,std::reverse
函数的第二个参数是反转范围的结束位置的后一位(即不包括该位置本身)。这是因为 std::reverse
使用的是半开区间 [first, last)
,它包括 first
,但不包括 last
。
这是一个局部的反转字符的写法
reverse(reverse_s.begin() + start, reverse_s.begin() + end);
思路:
这个结束的情况分两种。(n*k)
一种是在偶数n上结束,那么剩下的不足k的需要反转
一种是在奇数n上结束,那么剩下的不足k的不需要反转
所以我们只要维护好以偶数nk开头的,到结束区间在[nk+0,nk+k)的部分完成反转就可以了。