编程之美:第二章 数字之魅 2.17数组循环移位

原创 2015年08月03日 00:57:21
/*
数组循环移位:
设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。
此题已经做过,但本题的收获是注意循环移位,即,当K大于N时,注意到移N位后与没移位是一样的效果。因此
k %= n;

输入:
6 10 
5 6 1 2 3 4
输出:
1 2 3 4 5 6
*/

/*
关键:
1 k %= iLen;//防止k大于n,简化循环右移的处理
2 rightShift(pArr,0,iLen - k -1);//应该先移动n - k - 1个元素而不是k -1
*/
#include <stdio.h>
const int MAXSIZE = 10000;

void rightShift(int* pArr,int low,int high)
{
	int iTemp;
	for(; low < high ; low++,high--)
	{
		iTemp = pArr[low];
		pArr[low] = pArr[high];
		pArr[high] = iTemp;
	}
}

void reverse(int* pArr,int iLen,int k)
{
	if(!pArr || iLen <= 0)
	{
		return;
	}
	k %= iLen;//防止k大于n,简化循环右移的处理
	rightShift(pArr,0,iLen - k -1);//应该先移动n - k - 1个元素而不是k -1
	rightShift(pArr,iLen - k,iLen-1);
	rightShift(pArr,0,iLen-1);
}

void print(int* pArr,int iLen)
{
	for(int i = 0 ; i < iLen ; i++)
	{
		if(i)
		{
			printf(" %d",pArr[i]);
		}
		else
		{
			printf("%d",pArr[i]);
		}
	}
	printf("\n");
}

void process()
{
	int n,k;
	while(EOF != scanf("%d %d",&n,&k))
	{
		int iArr[MAXSIZE];
		for(int i = 0 ; i < n ; i++)
		{
			scanf("%d",&iArr[i]);
		}
		reverse(iArr,n,k);
		print(iArr,n);
	}
}

int main(int argc,char* argv[])
{
	process();
	getchar();
	return 0;
}

[编程之美2.17]数组循环移位

题目描述:设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量,如abcd1234循环右移三位,                     则为 ab...
  • qingmarch
  • qingmarch
  • 2013年04月11日 23:26
  • 340

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

1、最简单的做法一位一位移,时间复杂度O(K*N) string RightShift1(string &s, int n, int k) { while(k--) { char c =...
  • wxl3105
  • wxl3105
  • 2012年06月14日 19:38
  • 363

编程之美2.17 数组循环移位

这是一个很经典的题目,题目的大概意思是这样的:      有一个存储字符串的数组,需要按照要求循环移动数组中的字符,例如,数组中存储字符 abcd1234,循环右移4位,之后,会得到这样一个字符数组 ...
  • DLUTBruceZhang
  • DLUTBruceZhang
  • 2014年10月16日 14:39
  • 1248

编程之美 2.17 数组循环移位

编程之美 2.17 数组循环移位 把一个含有N个元素的数组循环右移K位, 要求时间复杂度位O(N), 且只允许使用两个附加变量. 解法: 使用逆序方法, 分开两段求逆序, 再整体求逆序. 代码 (...
  • u012515223
  • u012515223
  • 2013年11月07日 23:15
  • 1861

数组循环移位(编程之美2.17)

设计算法,把一个含有n个元素的数组循环右移k位,要求时间复杂度为O(n),只允许使用两个附加变量。 解法一:每次将数组中元素右移一位,这样算法能够实现移位,但是算法复杂度为O(k*n),代码如下...
  • qq819853294
  • qq819853294
  • 2012年09月27日 22:17
  • 296

编程之美2.17 数组循环移位

问题描述把一个含有N个元素的数组循环右移K位,如K=4的时候abcd1234->1234abcd。一般考虑K>0的情况,即右移;同时K=N的话可以通过K%=N得到一样的结果 解法思路详见代码注释/**...
  • zsuguangh
  • zsuguangh
  • 2011年04月22日 00:22
  • 1170

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

题目描述:设计一个算法,把一个含有N个元素的数组循环右移K位,要求算法的时间复杂度位O(Log2N)O(Log_2N),且只允许使用两个附加变量。 什么意思呢,就是说如果输入序列为:abcd1234...
  • u013220338
  • u013220338
  • 2015年08月14日 09:25
  • 574

编程之美读书笔记_2.17 数组循环移位

Normal 0 7.8 磅 0 2 false false false Microsof...
  • flyinghearts
  • flyinghearts
  • 2010年05月18日 23:49
  • 983

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

//---------------------------------------------- //        Author    :心海 //        Date      :2013-1...
  • Godwin_Q
  • Godwin_Q
  • 2015年01月01日 21:03
  • 305

编程之美读书笔记2.17—数组循环移位

解法1:直接 O(K*N)    解法2: .cpp
  • yuhan_9204
  • yuhan_9204
  • 2015年01月03日 21:58
  • 186
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编程之美:第二章 数字之魅 2.17数组循环移位
举报原因:
原因补充:

(最多只允许输入30个字)