题目地址(541. 反转字符串 II)

https://leetcode-cn.com/problems/reverse-string-ii/

题目描述

  1. 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
  2. 如果剩余字符少于 k 个,则将剩余字符全部反转。
  3. 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
  4. 示例 1
  5. 输入:s = "abcdefg", k = 2
  6. 输出:"bacdfeg"
  7. 示例 2
  8. 输入:s = "abcd", k = 2
  9. 输出:"bacd"
  10. 提示:
  11. 1 <= s.length <= 104
  12. s 仅由小写英文组成
  13. 1 <= k <= 104

前置知识


公司

  • 暂无

思路

在遍历字符串的过程中,只要让 i += (2 k),i 每次移动 2 k 就可以了,然后判断是否需要有反转的区间。

关键点

  • 当需要固定规律一段一段去处理字符串的时候,要想想在在for循环的表达式上做做文章
  • end取小值的判断

    代码

  • 语言支持:Java

Java Code:

  1. class Solution {
  2. public String reverseStr(String s, int k) {
  3. char[] chars = s.toCharArray();
  4. char temp ;
  5. int start,end;
  6. for (int i = 0; i < chars.length; i += 2 * k) {
  7. start = i;
  8. end = Math.min(start + k , chars.length)-1;
  9. while (start < end) {
  10. temp = chars[start];
  11. chars[start] = chars[end];
  12. chars[end] = temp;
  13. start ++;
  14. end--;
  15. }
  16. }
  17. return new String(chars);
  18. }
  19. }

复杂度分析

令 n 为数组长度。

  • 时间复杂度:541. 反转字符串 II - 图1#card=math&code=O%28n%29&id=M4rPG)
  • 空间复杂度:541. 反转字符串 II - 图2#card=math&code=O%28n%29&id=sBEgd)