摘要

给定一串字符串,然后给定一个值,你能根据题目要求,花式反转所给定的字符串吗?????

花式反转字符串

写于2021/05/28

  1. 题目描述:给定一个字符串 s 和一个整数 k,你需要对从字符串开头算起的每隔 2k 个字符的前 k 个字符进行反转。

    • 如果剩余字符少于 k 个,则将剩余字符全部反转。

    • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

  1. 示例描述:

    • 示例一:

      • 输入: s = “abcdefg”, k = 2
      • 输出:”bacdfeg”
    • 示例二:

      • 输入:s = “abcdefgdsdvsvdsdsf” , k = 3
      • 输出:”cbadefsdgdvssdvdsf”
  2. 解题思路:刚拿到这道题目的时候,读完题,然后看完示例的时候,脑子还是蒙的,不知道题目讲的啥意思。然后我就在leetcode里面有测试用例那里随便试了几个字符串,看结果,然后慢慢看预期结果与输入字符串之间变换的形式,之后就理解题目的意思。

    • 这道题目讲的是:把字符串划分为n/k(n为字符串的长度,k为题目所给的数)个子序列,每个子序列长度都为k,最后一个子序列长度可能小于或者等于k,如果前一个子序列反转了,那么下一个子序列就不反转,然后重复以上步骤,直到遍历n/k个子序列(反转从第一个子序列开始)。
    • 首先我们定义一个标志位flag,记录上个子序列是否反转,如果flag=true,说明该子序列需要反转,否则该子序列不用反转。然后定义一个记录该子序列开始位置的指针变量,找到该子序列的末尾位置,如果要反转,就对该子序列进行反转操作,否则说明该子序列不用反转,继续寻找下一个子序列起始与终止位置,进行反转。然后重复以上步骤,直到循环遍历完该n/k个子序列。
    • 具体代码与解释见代码示例,每一步都有详细解释。
  3. 代码示例:

    1. public String reverseStr(String s, int k) {
    2. //定义一个标志位
    3. //判断该子序列是否需要反转(flag=true,说明需要反转,flag=false,说明不需要反转)
    4. boolean flag = true;
    5. //把字符串转化为字符数组,方便后续的操作
    6. char[] chars = s.toCharArray();
    7. //定义一个指针,这是判断是否循环遍历了整个字符串
    8. int i = 0;
    9. while (i < chars.length) {
    10. //每个子序列长度为k
    11. int temp = k;
    12. //记录子序列的起始位置
    13. int start = i;
    14. //找到子序列的终点位置
    15. //i < chars.length是防止数组下标越界
    16. while (temp > 0 && i < chars.length) {
    17. i++;
    18. temp--;
    19. }
    20. //如果本次flag=true,说明从start到i的位置,该长度为k的子序列需要反转
    21. if (flag) {
    22. //本次反转了,那么下个子序列就不需要反转,所以标志位置为false
    23. flag = false;
    24. //以下操作为反转操作
    25. //子序列字符串的开始位置
    26. int indexStrat = start;
    27. //子序列字符串的结束位置
    28. int indexEnd = i-1;
    29. //反转字符串的基本操作
    30. while (indexStrat < indexEnd) {
    31. char tempChar = chars[indexEnd];
    32. chars[indexEnd] = chars[indexStrat];
    33. chars[indexStrat] = tempChar;
    34. indexStrat++;
    35. indexEnd--;
    36. }
    37. }
    38. //这次flag=false,说明下个子序列需要反转
    39. //所以flag置为true,这样下个子序列就能反转了
    40. else {
    41. flag=true;
    42. }
    43. }
    44. //因为我们对字符数组进行操作
    45. //结果返回一个字符串
    46. //所以返回以下操作就是生成结果
    47. String result = "";
    48. for (int j = 0; j < chars.length; j++) {
    49. result+=chars[j];
    50. }
    51. //返回结果
    52. return result;
    53. }