文章目录


前言

哈喽,我是长路,目前刚刚大三,方向是后端也偶尔捣鼓下前端,现在的主语言是Java。之前一大段时间都是在学习web开发的一些技术,就很久没有进行类似于数据结构、算法之类的学习与刷题,打算这段时间拾起来好好学一学、搞一搞。

这段时间也是机缘巧合看到草帽路飞的博客,加了自学群,正巧看到博主组织在群里组织了leetcode刷题打卡活动,我也就参与进来,为期一个月,打算坚持每天都花一些时间做一些题目,并通过博客的方式来进行记录。

目前跟着一个Github仓库刷题(leetcode):​​代码随想录leetcode刷题​​,当前为字符串专题。




题目

题目来源leetcode

leetcode地址:​​541. 反转字符串 II​​,难度:简单。

题目描述(摘自leetcode):

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

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

示例 2
输入:s = "abcd", k = 2
输出:"bacd"

提示:
1 <= s.length <= 104
s 仅由小写英文组成
1 <= k <= 104

本地调试代码:

class Solution {
public String reverseStr(String s, int k) {
...
}

public static void main(String[] args) {
System.out.println(new Solution().reverseStr("abcdefg", 2));
}

}




题解

思路:每次移动2*k,若是移动的位置在当前字符数组范围内对前k个进行反转,这是个循环过程。若是不在范围内,就要额外来处理两种情况。①剩余字符少于k个,剩余字符全部反转。②大于等于k个,小于2k个就反转前k个字符。详细可见代码

代码

public String reverseStr(String s, int k) {
int curPos = 2 * k;
char[] chars = s.toCharArray();
//每次循环2*k个字符
while (curPos <= s.length()) {
reverse(chars, curPos - 2 * k, curPos - k - 1);
curPos += 2 * k;
}
//判断是否有剩余字符
if ((curPos - 2 * k) <= s.length()) {
//剩余>=k <2*k情况,反转前面k个
if (curPos - k <= s.length()) {
reverse(chars, curPos - 2 * k, curPos - k - 1);
} else {
//反转剩余的全部
reverse(chars, curPos - 2 * k, s.length() - 1);
}

}
return new String(chars);
}

//反转字符串
public void reverse(char[] chars, int left, int right) {
while (left < right) {
chars[left] ^= chars[right];
chars[right] ^= chars[left];
chars[left++] ^= chars[right--];
}
}

leetcode【字符串—简单】541.反转字符串 II_算法







我是长路,感谢你的耐心阅读。如有问题请指出,我会积极采纳!
欢迎关注我的公众号【长路Java】,分享Java学习文章及相关资料
Q群:851968786 我们可以一起探讨学习