力扣 541 反转字符串 II
文章目录
题目链接
https://leetcode-cn.com/problems/reverse-string-ii/
1、题目要求
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至
2k 个字符,就反转这 2k 字符中的前 k 个字符。
如果剩余字符少于 k 个,则将剩余字符全部反转。
如果剩余字符小于 2k 但大于或等于 k 个,则反转前 k 个字符,其余字符保持原样。
示例 1:
输入:s = "abcdefg", k = 2
输出:"bacdfeg"
示例 2:
输入:s = "abcd", k = 2
输出:"bacd"
2、思路分析
和题目要求一样,从字符串的头开始,计数到
第 2*k 个字符的位置
(如果 k = 2,第一次就会计数到数组下标为 3 的位置 刚好 4 个字符),翻转前 k 个
(如果 k = 2 ,此处代表的数组下标是 1,刚好是两个字符);
3、执行代码 Java
class Solution {
// 按照题目的要求,从 i = i + 2 * k 开始,到达 Math.min(i + k,n) - 1;
public String reverseStr(String s, int k) {
int n = s.length();
char[] arr = s.toCharArray();
for (int i = 0; i < n; i += 2 * k) {
// 值传递,这里拷贝的是实际的地址,操作的是同一个数组;数值的话就是拷贝传递;
reverse(arr, i, Math.min(i + k, n) - 1);
}
return new String(arr);
}
public static void reverse(char[] arr, int left, int right) {
while (left < right) {
char temp;
temp = arr[left];
arr[left] = arr[right];
arr[right] = temp;
left++;
right--;
}
}
}
4、问题反思
4.1、for (int i = 0; i < n; i += 2 * k)
假设 k = 2; 这里面的 i 的取值为0 4 8 12…(也就是每 4 个元素为一小段,每一小段的开头的元素的数组下标
就是 0 4 8 12…)(就是第
1 5 9 13…个
元素)
每小段的开始下标
为 i 的取值,结束下标
为 Math.min(i + k, n) - 1;
4.2、Math.min(i + k, n) - 1
这是控制当最后一小段的时候,不能超出索引,也就是最后一小段没有 2*k 个元素的时候,将最后一小段全部翻转
5、小结
按照题目要求每次控制 i 前进的 2 * k 个单位,快速的进行满足题目条件的字符串翻转;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!