文章目录
前言
哈喽,我是长路,目前刚刚大三,方向是后端也偶尔捣鼓下前端,现在的主语言是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--];
}
}
参考文章
[1]. leetcode题解
[2]. 代码随想录—541. 反转字符串II
我是长路,感谢你的耐心阅读。如有问题请指出,我会积极采纳!
欢迎关注我的公众号【长路Java】,分享Java学习文章及相关资料
Q群:851968786 我们可以一起探讨学习
注明:转载可,需要附带上文章链接