541. Reverse String II
原题链接
Given a string and an integer k, you need to reverse the first k characters for every 2k characters counting from the start of the string. If there are less than k characters left, reverse all of them. If there are less than 2k but greater than or equal to k characters, then reverse the first k characters and left the other as original.
Example:
Input: s = "abcdefg", k = 2
Output: "bacdfeg"
Restrictions:
- The string consists of lower English letters only.
- Length of the given string and k will in the range [1, 10000]
题目大意:
- 给定一个字符串和一个整数k,你需要反转从字符串开始计数的每2k个字符的前k个字符。
- 如果剩余少于k个字符,则将剩余的所有字符都反转。
- 如果小于2k但大于或等于k个字符,则反转前k个字符,并将另一个作为原始字符
- 最重要的就是理解题意,刚开始题目没看懂很伤
代码如下:
#include <iostream>
#include <string>
using namespace std;
class Solution {
public:
string reverseStr(string s, int k) {//9ms
int sLength = s.length();
int business = sLength/(2*k);//商
int remainder = sLength - business*k*2;//余数
for(int i=0; i<business; i++){
for(int m=0,sta=i*k*2; m<k/2; m++){//翻转每2K个字符的前K个字符
char temp = s[sta];
s[sta] = s[sta+ k-1 - m*2];
s[sta+ k-1 - m*2] = temp;
sta++;
}
}
if(remainder<k){//剩余少于k个字符,将所有字符都反转 (剩余必定小于2k个字符)
for(int m=0,sta=business*k*2; m<remainder/2; m++){
char temp = s[sta];
s[sta] = s[sta+ remainder-1 - m*2];
s[sta+ remainder-1 - m*2] = temp;
sta++;
}
}
else{//小于2k但大于或等于k个字符,反转前k个字符
for(int m=0,sta=business*k*2; m<k/2; m++){//翻转前K个字符
char temp = s[sta];
s[sta] = s[sta+ k-1 - m*2];
s[sta+ k-1 - m*2] = temp;
sta++;
}
}
return s;
}
};
int main()
{
Solution a;
string s;
cin >> s;
cout << "s = " << s << endl;
cout << "翻转后s = " << a.reverseStr1(s, 4) << endl;
return 0;
}
做完之后发现里面的三个for循环可以单独写一个方法出来,用来处理翻转字符串s第sta位置后的K个元素
改进后代码:
string reverseStr1(string s, int k) {//6ms
int sLength = s.length();
int business = sLength/(2*k);//商
int remainder = sLength - business*k*2;//余数
for(int i=0; i<business; i++){
reverseK(s, i*k*2, k);//翻转每2K个字符的前K个字符
}
if(remainder<k){//剩余少于k个字符,将所有字符都反转 (剩余必定小于2k个字符)
reverseK(s, business*k*2, remainder);
}
else{//小于2k但大于或等于k个字符,反转前k个字符
reverseK(s, business*k*2, k);//翻转前K个字符
}
return s;
}
void reverseK(string &s, int sta, int k){//翻转字符串第sta位置后的K个元素
for(int m=0; m<k/2; m++){
char temp = s[sta];
s[sta] = s[sta+ k-1 - m*2];
s[sta+ k-1 - m*2] = temp;
sta++;
}
}