【每天学点算法题10.15】指定一个字符串,对字符串左旋K位

题目描述:指定一个字符串,进行左旋k位操作。即字符串的前k位字符移到字符串的尾部,形成新的字符串。如把字符串abcdef左旋3位,得到defabc。要求对长度为n的字符串,时间复杂度为O(n)。


笨方法:开辟一个大小为n的内存空间,将前k个字符拷到最后k个位置上,然后将原先的n-k个字符拷到前面的n-k个位置上。这种方法最直接,时间复杂度为O(n),空间复杂度也为O(n)。java实现代码如下。


public class ZuoXuan{
public static void main(String[] args){
String s="abcdef";
String l=leftRoate(s,3);
System.out.println(l);
}
public static String leftRoate(String str, int n){
String str1=str.substring(0,n);
String str2=str.substring(n);

return str2+str1;
}
}

比较好的解决办法是三次反转法,先反转前k个字符,然后反转后面的n-k个字符,然后反转整个字符串。如abcdef左旋3位,第一步反转前3个字符,变成cbadef,第二部反转后3个字符,变成cbafed,然后反转整个字符串变成defabc。这个算法的时间复杂度为O(n),空间复杂度为O(1)。java实现代码如下。


public class ZuoXuan{
public static void main(String[] args){
String s="abcdefg";
String l=leftRoate(s,3);
System.out.println(l);
}
public static String leftRoate(String str, int n){
if(str==null||str.length()==0){
return str;
}
if(n<=0||n>str.length()){
return str;
}
int begin=0;
int end=str.length()-1;

char []c=str.toCharArray();
reverseString(c,begin,n-1);
reverseString(c,n,end);
reverseString(c,begin,end);

return new String(c);

}
public static String reverseString(char[] c, int begin, int end){
if(begin>=end){
return null;
}
for(int i=begin,j=end;i<j;i++,j--){
char temp=c[i];
c[i]=c[j];
c[j]=temp;
}
return new String(c);
}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值