【LeetCode】 541. 反转字符串 II

版权声明:made by YYT https://blog.csdn.net/qq_37621506/article/details/83513868

1.题目

给定一个字符串和一个整数 k,你需要对从字符串开头算起的每个 2k 个字符的前k个字符进行反转。如果剩余少于 k 个字符,则将剩余的所有全部反转。如果有小于 2k 但大于或等于 k 个字符,则反转前 k 个字符,并将剩余的字符保持原样。

2.思路

step1:把字符串长度、对2k取余剩下的数字,以及÷2k得到的结果存储下来;
step2:先把钱2k个字符的前k个字符翻转
step3:讨论余数大小情况

3.代码

class Solution {
public:
    string reverseStr(string s, int k){
	int len=s.length();
	int bus=len/(2*k);
	int rem=len%(2*k);
	for(int i=0;i<bus;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(rem<k){//剩余少于k个字符,将所有字符都反转 (剩余必定小于2k个字符)
            for(int m=0,sta=bus*k*2; m<rem/2; m++){
                char temp=s[sta];
                s[sta]=s[sta+rem-1-m*2];
                s[sta+rem-1-m*2]=temp;
                sta++;
            }
        }
        else{//小于2k但大于或等于k个字符,反转前k个字符
            for(int m=0,sta=bus*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++;
            }
        }
	
	for(int i=0;i<s.length();i++)
		cout<<s[i];
	cout<<endl; 
	return s;
}
};

4.优秀案例

class Solution {
public:
    string reverseStr(string s, int k) {
          for(int i=0;i<s.size()-1;i+=2*k)
        {
            reverse(s.begin()+i,min(s.begin()+i+k,s.end()));
        }
        return s;

猜你喜欢

转载自blog.csdn.net/qq_37621506/article/details/83513868