Offer 驾到,掘友接招!我正在参与2022春招系列活动-刷题打卡任务,点击查看活动详情。
一、题目描述
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
示例
示例1:
输入: s = "abcdefg", k = 2
输出: "cdefgab"
示例2:
输入: s = "lrloseumgh", k = 6
输出: "umghlrlose"
限制
1 <= k < s.length <= 10000
难度:简单
此题为简单题,兄弟们可以重拳出击,没错,就是你想到的那种方法,简单粗暴!
二、思路分析
众所周知,力扣上,简单题是真简单,中等题有些困难,困难题看不懂答案。
题目解析
- 左旋转字符串操作,将原始字符串左旋转指定的位数,返回结果字符串。
- 左旋转过程中字符串中所有字符都会向左移动指定位数,如果到达头部,则下一次旋转至字符串尾部。
- 字符串旋转可以通过创建新字符串或数组的方式来从指定位置存储字符,遍历一次源数组后完成字符串旋转。
解题思路
对于左旋字符串求解思路,可以有以下两种:
- 创建一个缓冲字符串或字符数组,从旋转字符对应的位置开始遍历字符串,并将遍历到字符加入新字符串或数组中,从n遍历到尾部,再从0遍历到n,最终完成字符串旋转。
- 字符串旋转操作可以通过字符串的多次反转来实现,如果字符串向左旋转n个字符,则最终第n+1个字符位于头部,我们可以先将前n个字符组成的字符串反转,再将n到尾部的字符串反转,最后将整个字符串反转,最终得到的字符串就是需要的结果。
三、AC 代码
从指定位置遍历整个字符串
public String reverseLeftWords(String s, int n) {
//从指定位置遍历字符串,拼接得到新字符串
//可以用取余操作将两个循环合并
StringBuilder sb = new StringBuilder();
int len = s.length();
for(int i = n; i < len+n; i++){
sb.append(s.charAt(i % s.length()));
}
return sb.toString();
}
三次反转操作
public String reverseLeftWords(String s, int n) {
//利用数组旋转方法,坐旋转,右旋转,整体旋转
// 使用 StringBuffer 性能较差
String pro = s.substring(0,n);
String post = s.substring(n,s.length());
return new StringBuffer(new StringBuffer(pro).reverse().append(new StringBuffer(post).reverse())).reverse().toString();
// 其实可以直接将后边字符串拼接到前边
//return post+pro;
}
四、总结
知识点
- 循环中通过对数组长度取余,保证索引不越界且循环遍历数组
- 通过字符串创建缓冲字符串并反转,StringBuffer(str).reverse();
- 缓冲字符串拼接:sb.append(str);
最后
阳春三月,算法刷起来!LeetCode 剑指 Offer。
简单题,不需要考虑太多,开干就是了。