Day 1、字符串的旋转

要求:将字符串的前面的若干个字符移到字符串的后面。
例如:将 abcdef 的 abc 移动到 def 的后面。

1. 暴力破解

   所谓的暴力法就是将字符的每一个字符挨个移动到当前的字符串的后面,如果说字符串的总长度为 n,移动的位数为 m,则暴力破解法需要的复杂度就是O(n*m),控件复杂度为O(1)。
   这个时间复杂度是比较高的,所以我们需要找一种更好的方式进行优化。

3. 三步反转法

   所谓三步反转法总共分为三步:
   1. 将字符串 Z 分割为两部分:X和Y,即根据反转的位置将字符串进行分割。例如:字符串 abcdef 将 abc 移动到 def 的后面,就可以分为X:abc,Y:def。
   2. 将 X 和 Y 分别进行反转,即 X’ = cba,Y’ = fed。
   3. 将 X’ 和 Y’ 合并的到新的符串 Z’ ,同时将 Z‘ 进行反转得到 Z’‘。此时的 Z’’ 就是最终的结果。即 Z’ = cbafed,反转后得到 Z’’ = defabc。

/**
	将字符串进行反转。
	s: 需要进行反转的字符串
	start: 字符串反转开始的位置
	end: 字符串反转结束的位置
*/
void reverseString(char *s,int start,int end){
	while(start < end){
		char t = s[start];
		s[start++] = s[end];
		s[end --] = t;
	}
}

/**
	将字符串进行旋转
	s: 需要进行旋转的字符串
	n: 字符串的长度
	m: 开始旋转的位置
*/

void rotateString(char *s,int n,int m){
	m %= n;
	reverseString(s,0,m-1);			// 三步反转法进行旋转
	reverseString(s,m,n-1);
	reverseString(s,0,n-1);
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值