1. 程式人生 > 實用技巧 >[leetCode]541. 反轉字串 II

[leetCode]541. 反轉字串 II

csdn:https://blog.csdn.net/renweiyi1487/article/details/109330386

題目

連結:https://leetcode-cn.com/problems/reverse-string-ii

給定一個字串 s 和一個整數 k,你需要對從字串開頭算起的每隔 2k 個字元的前 k 個字元進行反轉。

如果剩餘字元少於 k 個,則將剩餘字元全部反轉。
如果剩餘字元小於 2k 但大於或等於 k 個,則反轉前 k 個字元,其餘字元保持原樣。

示例:

輸入: s = "abcdefg", k = 2
輸出: "bacdfeg"
 
提示:

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

雙指標

思路:計算字串一共能以2k的長度分為幾段,然後按照每段進行反轉。每段處理完成後按照規則處理剩餘部分。

class Solution {
    public String reverseStr(String s, int k) {
        char[] chars = s.toCharArray();
        int n = chars.length;
        int section = n / (2*k);
        int  i = 0;
        while (i  < section) {
            int begin = i * 2 * k;
            int end = begin + k - 1;
            reverse(chars, begin, end);
            i++;
        }
        int leaveLen = n - (i * 2 * k);
        if (leaveLen <= k) {
            reverse(chars, i * 2 * k, n - 1);
        } else if (leaveLen < 2 * k && leaveLen >= k) {
            reverse(chars, i *2 * k, i * 2 * k + k - 1);
        }
        return new String(chars);
    }

    private void reverse(char[] chars, int begin, int end) {
        while (begin < end) {
            char temp = chars[begin];
            chars[begin] = chars[end];
            chars[end] = temp;
            begin++;
            end--;
        }
    }
}

另外一種寫法,利用for迴圈分段處理

在for迴圈中利用i += (2 * k)即可分段處理

class Solution {
    public String reverseStr(String s, int k) {
        char[] chars = s.toCharArray();
        int n = chars.length;
        for (int i = 0; i < n; i += 2*k) {
            // 1. 每隔 2k 個字元的前 k 個字元進行反轉
            // 2. 剩餘字元小於 2k 但大於或等於 k 個,則反轉前 k 個字元
            if (i + k <= n) {
                reverse(chars, i, i + k - 1);
                continue;
            }
            // 3. 剩餘字元少於 k 個,則將剩餘字元全部反轉。
            reverse(chars, i,n-1);
        }
        return new String(chars);
    }

    private void reverse(char[] chars, int begin, int end) {
        while (begin < end) {
            char temp = chars[begin];
            chars[begin] = chars[end];
            chars[end] = temp;
            begin++;
            end--;
        }
    }
}