1. 程式人生 > 其它 >LeetCode——541. 反轉字串 II(Java)

LeetCode——541. 反轉字串 II(Java)

題目描述

題幹:
給定一個字串 s 和一個整數 k,從字串開頭算起,每 2k 個字元反轉前 k 個字元。
如果剩餘字元少於 k 個,則將剩餘字元全部反轉。
如果剩餘字元小於 2k 但大於或等於 k 個,則反轉前 k 個字元,其餘字元保持原樣。

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

示例 2:
輸入:s = "abcd", k = 2
輸出:"bacd"

題解思路

返回每k個字元反轉之後的字串,這裡要注意是每k個反轉一次,並且如果不夠長則全部反轉

首先反轉必寫的反轉函式老生常談了,雙指標while一遍反轉,這裡難點是每次的左右指標

如果我們每k個反轉一次,我們就必須每次增加2k個,只取k個反轉,如果右指標大於length則給他字串長度

正確程式碼

    public String reverseStr(String s, int k) {
        int length = s.length();
        char[] arr = s.toCharArray();

        for (int i = 0; i < length; i += 2 * k) {
            reverse(arr, i, Math.min(length, i + k) - 1);
        }

        return new String(arr);
    }

    private void reverse(char[] arr, int left, int right) {
        while (left < right) {
            char temp = arr[left];
            arr[left] = arr[right];
            arr[right] = temp;
            left++;
            right--;
        }
    }

總結

作為反轉plus版本我不知道有沒有Ⅲ,不過只需要找到每次反轉的範圍和邊界處理即可

如果文章存在問題或者有更好的題解,歡迎在評論區斧正和評論,各自努力,你我最高處見