字符串-反转字符串
字符串
反转字符串 (leetcode.344)
编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
class Solution {
public:
void reverseString(vector<char>& s) {
int n = s.size();
int right = n - 1;
for(int i = 0; i < n/2; ++i){
auto temp = s[i];
s[i] = s[right];
s[right] = temp;
--right;
}
}
};
难度并不大,主要是从for循环开始考虑,反转字符串,也就是始末交换,如果是偶数,那恰好可以交换成功,如果是奇数,会剩下中间一个不用交换,所以循环从开始到中间 n/2。
反转字符串II (leetcode.541)
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
- 如果剩余字符少于
k个,则将剩余字符全部反转。 - 如果剩余字符小于
2k但大于或等于k个,则反转前k个字符,其余字符保持原样。
题目虽然看上去有点复杂,但是总体来看,还是循环,首先我们需要一个可以相互交换的函数
void reverse(string& s, int start, int end){
for(int i = start,j = end; i < j; ++i, --j){
swap(s[i], s[j]);
}
}
输入一个字符串,规定始末,两两交换。
外层循环是2k步数,内存交换逻辑是前k个交换,如果k超出字符串大小,那么则交换剩下的。
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(); i += 2*k){
if(i+k <= s.size()){ // 正常情况,半个步长是小于等于字符串大小的
reverse(s,i,i+k-1); // 需要减1,因为是索引
} else {
reverse(s,i,s.size()-1);
}
}
return s;
}
};

浙公网安备 33010602011771号