【LeetCode每日一题】——541.反转字符串 II

一【题目类别】

  • 双指针

二【题目难度】

  • 简单

三【题目编号】

  • 541.反转字符串 II

四【题目描述】

  • 给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
    • 如果剩余字符少于 k 个,则将剩余字符全部反转。
    • 如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。

五【题目示例】

  • 示例 1:

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

    • 输入:s = “abcd”, k = 2
    • 输出:“bacd”

六【解题思路】

  • 这个题和昨天的【LeetCode每日一题】——344.反转字符串没有任何区别
  • 只是这个题目我们需要分段对其进行反转
  • 那么只需要按照题目要求的长度,将其传入昨天写的函数中进行反转即可
  • 还要注意如果最后不足k位,那么需要全部反转
  • 最后返回结果即可

七【题目提示】

  • 1 < = s . l e n g t h < = 1 0 4 1 <= s.length <= 10^4 1<=s.length<=104
  • s 仅由小写英文组成 s 仅由小写英文组成 s仅由小写英文组成
  • 1 < = k < = 1 0 4 1 <= k <= 10^4 1<=k<=104

八【时间频度】

  • 时间复杂度: O ( n ) O(n) O(n),其中 n n n 是字符数组的长度
  • 空间复杂度: O ( 1 ) O(1) O(1)

九【代码实现】

  1. Java语言版
package DoublePointer;

public class p541_ReverseStringII {

    public static void main(String[] args) {
        String s = "abcdefg";
        int k = 2;
        String res = reverseStr(s, k);
        System.out.println("res = " + res);
    }

    public static String reverseStr(String s, int k) {
        int len = s.length();
        char[] arr = s.toCharArray();
        for (int i = 0; i < len; i += (2 * k)) {
            reverse(arr, i, Math.min(i + k, len) - 1);
        }
        return new String(arr);
    }

    public static void reverse(char[] s, int left, int right) {
        while (left < right) {
            char temp = s[left];
            s[left] = s[right];
            s[right] = temp;
            left++;
            right--;
        }
    }

}
  1. C语言版
#include<stdio.h>
#include<string.h>

#define min(a,b) (a > b ? b : a)

void reverse(char* s, int left, int right)
{
	while (left < right)
	{
		char temp = s[left];
		s[left] = s[right];
		s[right] = temp;
		left++;
		right--;
	}
}

char * reverseStr(char * s, int k)
{
	int len = strlen(s);
	for (int i = 0; i < len; i += (2 * k))
	{
		reverse(s, i, min(i + k, len) - 1);
	}
	return s;
}

/*主函数省略*/

十【提交结果】

  1. Java语言版
    在这里插入图片描述

  2. C语言版
    在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

IronmanJay

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值