观看提示:
该博客因笔者水平能力不高,因此该博客质量低。
该博客是观看B站up主[吴师兄学算法]视频编写的。
剑指 Offer 58 - II. 左旋转字符串
- 要求:
- 提供:给个字符串,给个数字。
- 效果:以数字为字符串的元素下标,元素下标前的字符移动到尾部。
- 示例
-
输入: s = "abcde", n = 2 输出: "cdeab"
-
- 思路
- 重点-怎么交换元素位置?
- 双指针可以让字符串的元素左右交换位置。
- 对字符串使用双指针前的准备:
- 获取字符串的长度,
- int length = s.length();
- 把字符串转换为字符数组的形式
- char[] chars = s.toCharArray();
- 获取字符串的长度,
- 重点-交换元素位置的具体做法:
- 以s = "abcde", n = 2 为例子。
- 第一次交换:
- 完成效果:s="edcba",
- 说明:只完成n下标左右边元素交换,但还有排序问题。
- 第二次交换:
- 完成效果:s="cdeba",
- 说明:解决了n下标左边排序问题。
- 第二次交换:
- 完成效果:s="cdeab",
- 说明:解决了n下标右边排序问题。
- 难点-控制第N次交换的头尾指针:
- 第一次交换:
- 头指针一定从0开始,
- 尾指针一定从length - 1开始。
- 第二次交换:
- 头指针一定从0开始,
- 尾指针从n下标的左+1位置,即 length -1 - n 位置开始。
- 第三次交换:
- 头指针从n下标的右+1位置,即 length - n 位置开始。
- 尾指针一定从length - 1开始。
- 第一次交换:
- 难点-交换元素位置的方法(伪代码):
// 以 s = "abcde" k=2 的第一次交换为例 // 第一次交换传进来参数:变成数组的chars, 头指针=0, 尾指针=3 private void reverse(char[] chars, int 头指针, int 尾指针) { while (头指针 < 尾指针) { // 暂时保存首位置的字符 char 临时变量 = chars[头指针]; // 首位置得到尾字符 chars[头指针] = chars[尾指针]; // 尾位置得到首字符 chars[end] = temp; // 头尾指针分别向右和向左移动 头指针++; 尾指针--; }
- 重点-怎么交换元素位置?
//完整代码来自[吴师兄学算法]
class Solution {
public String reverseLeftWords(String s, int n) {
// 双指针对字符串使用前的准备
int length = s.length();
char[] chars = s.toCharArray();
// 第一次交换
reverse(chars, 0, length - 1);
// 第二次交换
reverse(chars, 0, length - n - 1);
// 第三次交换
reverse(chars, length - n, length - 1);
// 返回字符串结果
return new String(chars);
}
// 双指针交换的具体方法
private void reverse(char[] chars, int start, int end) {
while (start < end) {
char temp = chars[start];
chars[start] = chars[end];
chars[end] = temp;
start++;
end--;
}
}
}