rotate实现


rotate<不含3次翻转>

#include<iostream>




/*

案例一 长度7旋转2 gcd = 1 故 i < 1
i = 0    i = (i+dis)%len
_bcdefg  (0+2)%7 = 2
cb_defg  (2+2)%7 = 4
cbed_fg  (4+2)%7 = 6
cbedgf_  (6+2)%7 = 1
c_edgfb  (1+2)%7 = 3
cde_gfb  (3+2)%7 = 5
cdefg_b  (5+2)%7 = 0 循环结束 0 = 0
cdefgab  初始空缺位补上




案例二 长度6旋转3 gcd = 3 故 i < 3
i = 0 
abcdef 
_bcdef (0+3)%6 = 3
dbc_ef (3+3)%6 = 0 循环结束
dbcaef 补上循环初始位
i = 1
d_caef (1+3)%6 = 4
deca_f (4+3)%6 = 1 循环结束
decabf 补上循环初始位
i = 2
de_abf (2+3)%6 = 5
defab_ (5+3)%6 = 2 循环结束
defabc 补上循环初始位


*/


int gcd(int m, int n){//求最大公约数
	int t;
	while ((t = m%n) != 0){
		m = n;
		n = t;
	}
	return n;
}


void myrotate_cycle(char *str, char* first,int dis,int len)
{
	char cfirst = *first;
	char *temp = first;
	char *ptr = first + (first - str + dis) % len;
	while (ptr != first){
		*temp = *ptr;
		temp = ptr;
		int n = ptr - str;
		ptr = first + (ptr - str + dis) % len;
	}
	*temp = cfirst;
}


void myrotate(char *str, char* middle)
{
	int len = strlen(str);
	int dis = middle - str;
	int per = gcd(dis, len);
	
	int i = 0;
	while (i < per){//循环次数 [0,gcd)
		myrotate_cycle(str, str + i, dis, len);//从 str+i位置开始,开始一个循环,总计n次赋值变换可以实现左旋转
		i++;
	}
}


int main(int argc, char **argv)
{
	char str[10] = "xxhello";
	myrotate(str, str+3);


	std::cout << str << std::endl;
	system("pause");
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值