给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1:
**输入:** s = "abcdefg", k = 2
**输出:** "bacdfeg"
示例 2:
**输入:** s = "abcd", k = 2
**输出:** "bacd"
提示:
1 <= s.length <= 104
s 仅由小写英文组成
1 <= k <= 104
方法一:模拟
我们直接按题意进行模拟:反转每个下标从 2k 的倍数开始的,长度为 k 的子串。若该子串长度不足 k,则反转整个子串。
[sol1-Python3]
1 2 3 4 5 6
classSolution: defreverseStr(self, s: str, k: int) -> str: t = list(s) for i inrange(0, len(t), 2 * k): t[i: i + k] = reversed(t[i: i + k]) return"".join(t)
[sol1-C++]
1 2 3 4 5 6 7 8 9 10
classSolution { public: string reverseStr(string s, int k){ int n = s.length(); for (int i = 0; i < n; i += 2 * k) { reverse(s.begin() + i, s.begin() + min(i + k, n)); } return s; } };
publicclassSolution { publicstringReverseStr(string s, int k) { int n = s.Length; char[] arr = s.ToCharArray(); for (int i = 0; i < n; i += 2 * k) { Reverse(arr, i, Math.Min(i + k, n) - 1); } returnnewstring(arr); }
publicvoidReverse(char[] arr, int left, int right) { while (left < right) { char temp = arr[left]; arr[left] = arr[right]; arr[right] = temp; left++; right--; } } }
[sol1-Golang]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
funcreverseStr(s string, k int)string { t := []byte(s) for i := 0; i < len(s); i += 2 * k { sub := t[i:min(i+k, len(s))] for j, n := 0, len(sub); j < n/2; j++ { sub[j], sub[n-1-j] = sub[n-1-j], sub[j] } } returnstring(t) }
funcmin(a, b int)int { if a < b { return a } return b }
[sol1-JavaScript]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
var reverseStr = function(s, k) { const n = s.length; const arr = Array.from(s); for (let i = 0; i < n; i += 2 * k) { reverse(arr, i, Math.min(i + k, n) - 1); } return arr.join(''); };