记录新手小白的做题历程。
题目:
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
思路:感觉跟344的反转数字差不多,只需要判断一下剩下字符串的长度是否大于等于k。但打了一次代码,发现题目还有一个要求,每计数至2k,即是以2k为一个周期的。所以用while将字符串圈入循环,用一个first记开头,每次加2k,然后判断剩下的字符是否多于K个,以给定对应的right。
class Solution {
public:
string reverseStr(string s, int k) {
int n=s.size();
int first=0;//记录开头
while(first<n-1){
if(n-first<k){//不剩k个
for(int left=first,right=n-1;left<right;left++,right--){
swap(s[left],s[right]);
}
}
else{//多于k个
for(int left=first,right=first+k-1;left<right;left++,right--){//主要的区别就是尾巴从哪里取
swap(s[left],s[right]);
}
}
first+=2*k;
}
return s;
}
};
官方太机智了,用reverse反转也是个很好的选择,头节点是algorithm
不过要记得reverse的用法:
reverse(s.begin() + i, s.begin() + min(i + k, n));
并且很巧妙地用min来判断剩下的数是否超出范围。
class Solution {
public:
string reverseStr(string s, int k) {
int n = s.length();
for (int i = 0; i < n; i += 2 * k) {//i直接加2*k
reverse(s.begin() + i, s.begin() + min(i + k, n));
}
return s;
}
};
学到了学到了!
下一题!