花式反转字符串 Posted on 2021-07-19 00:00:00 2021-07-19 00:00:00 by Author 摘要 给定一串字符串,然后给定一个值,你能根据题目要求,花式反转所给定的字符串吗????? # 花式反转字符串 1. 题目描述:给定一个字符串 `s` 和一个整数 `k`,你需要对从字符串开头算起的每隔 `2k` 个字符的前 `k` 个字符进行反转。 - 如果剩余字符少于 `k` 个,则将剩余字符全部反转。 - 如果剩余字符小于 `2k` 但大于或等于 `k` 个,则反转前 `k` 个字符,其余字符保持原样。 2. 示例描述: - 示例一: - 输入: s = "abcdefg", k = 2 - 输出:"bacdfeg" - 示例二: - 输入:s = "abcdefgdsdvsvdsdsf" , k = 3 - 输出:"cbadefsdgdvssdvdsf" 3. 解题思路:刚拿到这道题目的时候,读完题,然后看完示例的时候,脑子还是蒙的,不知道题目讲的啥意思。然后我就在leetcode里面有测试用例那里随便试了几个字符串,看结果,然后慢慢看预期结果与输入字符串之间变换的形式,之后就理解题目的意思。 - 这道题目讲的是:把字符串划分为`n/k`(n为字符串的长度,k为题目所给的数)个子序列,每个子序列长度都为k,最后一个子序列长度可能小于或者等于k,如果前一个子序列反转了,那么下一个子序列就不反转,然后重复以上步骤,直到遍历n/k个子序列(反转从第一个子序列开始)。 - 首先我们定义一个标志位flag,记录上个子序列是否反转,如果flag=true,说明该子序列需要反转,否则该子序列不用反转。然后定义一个记录该子序列开始位置的指针变量,找到该子序列的末尾位置,如果要反转,就对该子序列进行反转操作,否则说明该子序列不用反转,继续寻找下一个子序列起始与终止位置,进行反转。然后重复以上步骤,直到循环遍历完该n/k个子序列。 - 具体代码与解释见代码示例,每一步都有详细解释。 4. 代码示例: ```java 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; } ```
{{ item.content }}
{{ child.content }}