一【题目类别】
- 双指针
二【题目难度】
- 简单
三【题目编号】
- 541.反转字符串 II
四【题目描述】
- 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
- 如果剩余字符少于 k 个,则将剩余字符全部反转。
- 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
五【题目示例】
-
示例 1:
- 输入:s = “abcdefg”, k = 2
- 输出:“bacdfeg”
-
示例 2:
- 输入:s = “abcd”, k = 2
- 输出:“bacd”
六【解题思路】
- 这个题和昨天的【LeetCode每日一题】——344.反转字符串没有任何区别
- 只是这个题目我们需要分段对其进行反转
- 那么只需要按照题目要求的长度,将其传入昨天写的函数中进行反转即可
- 还要注意如果最后不足k位,那么需要全部反转
- 最后返回结果即可
七【题目提示】
- 1 < = s . l e n g t h < = 1 0 4 1 <= s.length <= 10^4 1<=s.length<=104
- s 仅由小写英文组成 s 仅由小写英文组成 s仅由小写英文组成
- 1 < = k < = 1 0 4 1 <= k <= 10^4 1<=k<=104
八【时间频度】
- 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是字符数组的长度
- 空间复杂度: O ( 1 ) O(1) O(1)
九【代码实现】
- Java语言版
package DoublePointer;
public class p541_ReverseStringII {
public static void main(String[] args) {
String s = "abcdefg";
int k = 2;
String res = reverseStr(s, k);
System.out.println("res = " + res);
}
public static String reverseStr(String s, int k) {
int len = s.length();
char[] arr = s.toCharArray();
for (int i = 0; i < len; i += (2 * k)) {
reverse(arr, i, Math.min(i + k, len) - 1);
}
return new String(arr);
}
public static void reverse(char[] s, int left, int right) {
while (left < right) {
char temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
}
- C语言版
#include<stdio.h>
#include<string.h>
#define min(a,b) (a > b ? b : a)
void reverse(char* s, int left, int right)
{
while (left < right)
{
char temp = s[left];
s[left] = s[right];
s[right] = temp;
left++;
right--;
}
}
char * reverseStr(char * s, int k)
{
int len = strlen(s);
for (int i = 0; i < len; i += (2 * k))
{
reverse(s, i, min(i + k, len) - 1);
}
return s;
}
/*主函数省略*/
十【提交结果】
-
Java语言版
-
C语言版