给定一个字符串s
和一个整数 k
,从字符串开头算起,每计数至 2k
个字符,就反转这 2k
字符中的前 k
个字符。
k
个,则将剩余字符全部反转。2k
但大于或等于 k
个,则反转前 k
个字符,其余字符保持原样。示例1:
输入:s = "abcdefg", k = 2
输出:"bacdfeg"
示例2:
输入:s = "abcd", k = 2
输出:"bacd"
提示:
我们直接按题意进行模拟:反转每个下标从 2k 的倍数开始的,长度为 k 的子串。若该子串长度不足 k,则反转整个子串。
代码:
public class Solution {
public string ReverseStr(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);
}
return new string(arr);
}
public void Reverse(char[] arr, int left, int right) {
while (left < right) {
char temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}
}
执行结果
通过
执行用时:92 ms,在所有 C# 提交中击败了22.50%的用户
内存消耗:37.8 MB,在所有 C# 提交中击败了12.90%的用户
思路解析 我们直接按题意进行模拟:反转每个下标从 2k 的倍数开始的,长度为 k 的子串。若该子串长度不足 k,则反转整个子串。
代码:
class Solution {
public String reverseStr(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);
}
return new String(arr);
}
public void reverse(char[] arr, int left, int right) {
while (left < right) {
char temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}
}
执行结果
通过
执行用时:1 ms,在所有 Java 提交中击败了100.00%的用户
内存消耗:38.1 MB,在所有 Java 提交中击败了98.40%的用户
复杂度分析
时间复杂度:O( n )
空间复杂度:O(1)
C#
和 Java
两种编程语言进行解题