力扣--541反轉字符串 II

題目描述
給定一個字符串和一個整數 k,你需要對從字符串開頭算起的每個 2k 個字符的前k個字符進行反轉。如果剩餘少於 k 個字符,則將剩餘的所有全部反轉。如果有小於 2k 但大於或等於 k 個字符,則反轉前 k 個字符,並將剩餘的字符保持原樣。

示例:

輸入: s = “abcdefg”, k = 2
輸出: “bacdfeg”

要求:

該字符串只包含小寫的英文字母。
給定字符串的長度和 k 在[1, 10000]範圍內。

思路
將題目的三句話拆成三個if條件即可。定義一個標誌p,初始值爲0,通過它找到當前訪問的元素位置。

  1. 如果剩餘字符大於2k個,則利用reverse函數執行翻轉。每次起點爲p+begin(),終點爲p+k+begin()。
  2. 如果剩餘少於 k 個字符,則翻轉全部,起點爲p+begin(),終點爲end().
  3. 如果有小於 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;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章