编程之美2.17——数组循环移位

1、最简单的做法一位一位移,时间复杂度O(K*N)

string RightShift1(string &s, int n, int k)
{
	while(k--)
	{
		char c = s[n-1];
		for(int i = n - 1; i > 0; i--)
			s[i] = s[i-1];
		s[0] = c;
	}
	return s;
}

2、当K很大时,移动K位相当于移动  K%N 位O(N^2)

string RightShift2(string &s, int n, int k)
{
	k %= n;
	while(k--)
	{
		char c = s[n-1];
		for(int i = n - 1; i > 0; i--)
			s[i] = s[i-1];
		s[0] = c;
	}
	return s;
}

3、O(N)的做法

//对于abcd1234,若循环右移4位得到的1234abcd,
//可以看出有两部分是没有变的一部分是abcd,另一部分是1234
//所以可以通过以下三步完成循环移位:
//1、逆序排列abcd,得到dcba1234;
//2、逆序排列1234,得到dcba4321,
//3、逆序排列dcba4321,得到1234abcd;

void Reverse(string &s, int b, int e)
{
	for(; b < e; b++,e--)
	{
		char temp = s[e];
		s[e] = s[b];
		s[b] = temp;
	}
}

string RightShift3(string &s, int n, int k)
{
	k %= n;
	Reverse(s,0,n-k-1);
	Reverse(s,n-k,n-1);
	Reverse(s,0,n-1);
	return s;
}

    原文作者:wxl3105
    原文地址: https://blog.csdn.net/wxl3105/article/details/7664269
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞