题目
给定一个字符串 s 和一个整数 k,从字符串开头算起,每 2k 个字符反转前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
来源:力扣(LeetCode) 链接:原题 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
示例
1.输入:s = “abcdefg”, k = 2 输出:“bacdfeg”
2.输入:s = “abcd”, k = 2 输出:“bacd”
思路分析
题目为简单的字符串交换,无非是考虑交换的位置问题以及交换次序问题,我的思路是先将字符串长度除以2k,得出有字符串中有多少组子串是以2k为长度的(这里称之为正常交换字符串,即正常字符串)。之后通过字符串长度除以2k取余数得到要特殊处理的子串(这里称之为特殊字符串),然后根据具体要求分情况操作特殊子串,之后正常字符串+特殊字符串即可以得到目标答案。
自己的代码实现(非常笨的AC方式,忘记了reverse函数,谨以此记)
class Solution {
public:
string reverseStr(string s, int k) {
int group=s.size()/(2*k);
int yu=s.size()%(2*k);
string result;
string tstring;
string specialstring;
string laststring;
int count=0;
for(int i=0;i<group;i++)
{
tstring=s.substr(count,2*k);
CommonSwap(tstring,k);
if((count+2*k-1)>(s.size()-1))
{
count=count;
}
else
{
count+=2*k;
}
result+=tstring;
}
tstring=s.substr(count,yu);
int changenum=tstring.size()/2;
char t;
if(tstring.size()<k&&tstring.size()!=0)
{
for(int i=0;i<changenum;i++)
{
t=tstring[i];
tstring[i]=tstring[tstring.size()-1-i];
tstring[tstring.size()-1-i]=t;
}
result+=tstring;
}
if(tstring.size()>=k&&tstring.size()<(2*k))
{
specialstring=tstring.substr(0,k);
laststring=tstring.substr(k,tstring.size()-k);
changenum=specialstring.size()/2;
for(int i=0;i<changenum;i++)
{
t=specialstring[i];
specialstring[i]=specialstring[specialstring.size()-1-i];
specialstring[specialstring.size()-1-i]=t;
}
result+=specialstring;
result+=laststring;
}
return result;
}
void CommonSwap(string &a,int k){
char t;
for(int i=0;i<k/2;i++)
{
t=a[i];
a[i]=a[k-1-i];
a[k-1-i]=t;
}
}
};
代码分析
我写的时候大量运用了string类下的substr方法来分割字符串,这也是很常见的一种分割字符串的方法,我当时不清楚主程序是否引用了algorithm类所以没使用reverse(当时写的时候也忘记了,后来反思的时候不知道主程序有没有,看了官答知道有)。主体也就是分割然后处理,很萌新的一种思路,看了官答发现了自己的愚蠢(大一狗的眼泪),还会继续努力!
AC图片
官答(自认为最好的思路与方法)
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;
}
};
作者:LeetCode-Solution 链接: 优良答案机票. 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
直接用reverse与min实现了整个字符串的操作=-=,大一萌新佩服佩服(自己真的菜)!! 努力刷题继续加油!!!
2021.8.20
|