1. 程式人生 > >【LeetCode】 541. 反轉字串 II

【LeetCode】 541. 反轉字串 II

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;