题目概述
对应力扣中剑指 Offer 58 – 左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串”abcdefg”和数字2,该函数将返回左旋转两位得到的结果”cdefgab”。
输入: s = “abcdefg”, k = 2
输出: “cdefgab”
输入: s = “lrloseumgh”, k = 6
输出: “umghlrlose”
解题思路
如果可以另外开辟空间,这个题会变得十分的简单,而如果加以限制,只能在本字符串上进行操作,不能开辟额外的空间,这个题难度会上升,此处我分享后者的思路。
我先开始想的是能不能用字符串系列②中提到的倒着填充数组的办法,发现怎样都行不通,无论如何数据都会损失。后来想到可以先将字符串整体翻转过来,再将两个子区间分别进行翻转就能得到答案。当然先对两个子区间翻转,再对整体进行翻转同样也可以。这也就给我们的字符串翻转问题提供了两种全新的思路:
- 先整体翻转,再局部翻转。
- 先局部翻转,再整体翻转。
而翻转的具体操作则还是前面提到的双指针法。
代码实现
public String solution(String s,int n){
//此方法不开辟额外空间,只对本串操作
char[] ss = s.toCharArray();
//先对整个字符串进行翻转
myReverse(ss,0,ss.length-1);
//在对两个子区间进行单独反转
myReverse(ss,ss.length-n,ss.length-1);
myReverse(ss,0,ss.length - n - 1);
return new String(ss);
}
public void myReverse(char[] a,int start,int end){
//规定双指针构造的是闭区间
//创建第三者中间人
char temp;
while(start < end){
temp = a[start];
a[start] = a[end];
a[end] = temp;
start++;
end--;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/122338.html