題目描述
給定一個字符串和一個整數 k,你需要對從字符串開頭算起的每個 2k 個字符的前k個字符進行反轉。如果剩餘少於 k 個字符,則將剩餘的所有全部反轉。如果有小於 2k 但大於或等於 k 個字符,則反轉前 k 個字符,並將剩餘的字符保持原樣。
示例:
輸入: s = “abcdefg”, k = 2
輸出: “bacdfeg”
要求:
該字符串只包含小寫的英文字母。
給定字符串的長度和 k 在[1, 10000]範圍內。
思路
將題目的三句話拆成三個if條件即可。定義一個標誌p,初始值爲0,通過它找到當前訪問的元素位置。
- 如果剩餘字符大於2k個,則利用reverse函數執行翻轉。每次起點爲p+begin(),終點爲p+k+begin()。
- 如果剩餘少於 k 個字符,則翻轉全部,起點爲p+begin(),終點爲end().
- 如果有小於 2k 但大於或等於 k 個字符,與(1)一樣。
踩過的坑
第一次寫的時候手殘在end()後面-1,注意reverse()函數的參數!它的參數就是begin()和end()!可以將begin()和end()區間的元素全部逆置,所以不要像我一樣畫蛇添足。
源代碼
class Solution {
public:
string reverseStr(string s, int k) {
if(s.empty())
{
return nullptr;
}
int size=s.size();
int p=0;
while(p<size)
{
if(p+2*k<=size)
{
reverse(s.begin()+p,s.begin()+p+k);
}
if(p+k>size)
{
reverse(s.begin()+p,s.end());
}
if(p+2*k>size&&p+k<=size)
{
reverse(s.begin()+p,s.begin()+p+k);
}
p+=2*k;
}
return s;
}
};