Leetcode-541-反转字符串II

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

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

题目描述

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

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

 

示例:

输入: s = "abcdefg", k = 2
输出: "bacdfeg"


 

提示:

该字符串只包含小写英文字母。
给定字符串的长度和 k 在 [1, 10000] 范围内。

前置知识

  • Java中数组的复制方法

思路

  • 其实在遍历字符串的过程中,只要让 i += (2 * k),i 每次移动 2 * k 就可以了,然后判断是否需要有反转的区间。
    因为要找的也就是每2 * k 区间的起点,这样写程序会高效很多

关键点

代码

  • 语言支持:Java

Java Code:

class Solution {
    
    
    public String reverseStr(String s, int k) {
    
    
        char[] ch = s.toCharArray();
        for (int i = 0; i < ch.length; i += k * 2) {
    
    
            if (i + k <= ch.length) {
    
    
                reverse(ch, i, i + k -1);
                continue;
            } else {
    
    
                reverse(ch, i, ch.length - 1);
            }
            
        }
        
        String str = new String(ch);
        return str;
    }
    
    public void reverse(char[] ch, int i, int j) {
    
    
        char temp;
        while (i < j) {
    
    
            temp = ch[i];
            ch[i] = ch[j];
            ch[j] = temp;
            i++;
            j--;
        }
    }
}


复杂度分析

令 n 为数组长度。
里面while应该跟k有关系,外面start由for循环决定,里面的while循环,间隔<=k,由题目可知,k就是一个常数,范围题目也给定了,所以while时间复杂度可视为O(1),所以总的时间复杂度为O(n)

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( n ) O(n) O(n)

猜你喜欢

转载自blog.csdn.net/weixin_48969816/article/details/114375443