leetcode 541 反转字符串II
前言
题目:541. 反转字符串 II
参考答案:反转字符串 II-力扣官方题解
提交代码
字符串翻转的模拟题。
我没有原位翻转,所以代码略微复杂了些。我尽可能将代码写的好看精简。
class Solution {
public:
string reverseStr(string s, int k) {
string result;
int reverseNum = s.size()/(2*k);
int leaveNum = s.size()%(2*k) >= k ? 1 : 0 ; // 剩余字符小于2k&&大于等于k,用1标识;小于k用0标识。
// 每2k个字符,翻转前k个
for(int i=0; i<reverseNum; i++){
reverse_copy(s.begin()+i*2*k,s.begin()+i*2*k+k,back_inserter(result));
copy(s.begin()+i*2*k+k,s.begin()+i*2*k+2*k,back_inserter(result));
}
// 处理剩余的字符
if(leaveNum == 0){ // 剩余字符<k
reverse_copy(s.begin()+reverseNum*2*k,s.end(),back_inserter(result));
}else{ // k<=剩余字符<2k
reverse_copy(s.begin()+reverseNum*2*k,s.begin()+reverseNum*2*k+k,back_inserter(result));
copy(s.begin()+reverseNum*2*k+k,s.end(),back_inserter(result));
}
return result;
}
};
参考答案采用原位翻转是比较合理的操作。因为传入的是字符串的拷贝,原位翻转不会影响原来的字符串。原位翻转,只需要一个指针累加,处理起来也更加方便。下面是参考答案的代码。
class Solution {
public:
string reverseStr(string s, int k) {
int n = s.length();
for (int i = 0; i < n; i += 2 * k) {
reverse(s.begin() + i, s.begin() + min(i + k, n));
}
return s;
}
};
还没有评论,来说两句吧...