摘要
给定一串字符串,然后给定一个值,你能根据题目要求,花式反转所给定的字符串吗?????
花式反转字符串
写于2021/05/28
题目描述:给定一个字符串
s
和一个整数k
,你需要对从字符串开头算起的每隔2k
个字符的前k
个字符进行反转。如果剩余字符少于
k
个,则将剩余字符全部反转。如果剩余字符小于
2k
但大于或等于k
个,则反转前k
个字符,其余字符保持原样。
示例描述:
示例一:
- 输入: s = “abcdefg”, k = 2
- 输出:”bacdfeg”
示例二:
- 输入:s = “abcdefgdsdvsvdsdsf” , k = 3
- 输出:”cbadefsdgdvssdvdsf”
解题思路:刚拿到这道题目的时候,读完题,然后看完示例的时候,脑子还是蒙的,不知道题目讲的啥意思。然后我就在leetcode里面有测试用例那里随便试了几个字符串,看结果,然后慢慢看预期结果与输入字符串之间变换的形式,之后就理解题目的意思。
- 这道题目讲的是:把字符串划分为
n/k
(n为字符串的长度,k为题目所给的数)个子序列,每个子序列长度都为k,最后一个子序列长度可能小于或者等于k,如果前一个子序列反转了,那么下一个子序列就不反转,然后重复以上步骤,直到遍历n/k个子序列(反转从第一个子序列开始)。 - 首先我们定义一个标志位flag,记录上个子序列是否反转,如果flag=true,说明该子序列需要反转,否则该子序列不用反转。然后定义一个记录该子序列开始位置的指针变量,找到该子序列的末尾位置,如果要反转,就对该子序列进行反转操作,否则说明该子序列不用反转,继续寻找下一个子序列起始与终止位置,进行反转。然后重复以上步骤,直到循环遍历完该n/k个子序列。
- 具体代码与解释见代码示例,每一步都有详细解释。
- 这道题目讲的是:把字符串划分为
代码示例:
public String reverseStr(String s, int k) {
//定义一个标志位
//判断该子序列是否需要反转(flag=true,说明需要反转,flag=false,说明不需要反转)
boolean flag = true;
//把字符串转化为字符数组,方便后续的操作
char[] chars = s.toCharArray();
//定义一个指针,这是判断是否循环遍历了整个字符串
int i = 0;
while (i < chars.length) {
//每个子序列长度为k
int temp = k;
//记录子序列的起始位置
int start = i;
//找到子序列的终点位置
//i < chars.length是防止数组下标越界
while (temp > 0 && i < chars.length) {
i++;
temp--;
}
//如果本次flag=true,说明从start到i的位置,该长度为k的子序列需要反转
if (flag) {
//本次反转了,那么下个子序列就不需要反转,所以标志位置为false
flag = false;
//以下操作为反转操作
//子序列字符串的开始位置
int indexStrat = start;
//子序列字符串的结束位置
int indexEnd = i-1;
//反转字符串的基本操作
while (indexStrat < indexEnd) {
char tempChar = chars[indexEnd];
chars[indexEnd] = chars[indexStrat];
chars[indexStrat] = tempChar;
indexStrat++;
indexEnd--;
}
}
//这次flag=false,说明下个子序列需要反转
//所以flag置为true,这样下个子序列就能反转了
else {
flag=true;
}
}
//因为我们对字符数组进行操作
//结果返回一个字符串
//所以返回以下操作就是生成结果
String result = "";
for (int j = 0; j < chars.length; j++) {
result+=chars[j];
}
//返回结果
return result;
}
您还没有登录,登录后即可评论