【LeetCode】 541. 反轉字串 II
阿新 • • 發佈:2018-11-03
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;