[leetCode]541. 反轉字串 II
阿新 • • 發佈:2020-10-28
csdn:https://blog.csdn.net/renweiyi1487/article/details/109330386
題目
給定一個字串 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--; } } }