编程之美:第二章 数字之魅 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;
}

相关文章推荐

[编程之美] PSet2.17 数组循环移位

设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附件变量。比如abcd1234右移4位后为:1234abcd。...

编程之美2.17 数组循环移位

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

《编程之美》学习笔记——2.17数组循环移位

一、问题 设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。 问题分析:  输入:长度为N的原数组,K  输出:循环右移K位后的数组  约束:时间...

旋转字符串;编程珠玑第二章;rotate a one-dimensional vector;循环移位数组;编程之美

一:问题描述: 编程珠玑第二章的第二个问题是字符串(或者理解为向量)旋转问题,具体描述如下: rotate a one-dimensional vector of n elements left...

2.17 数组循环移位

1. 前言本文的一些图片, 资料 截取自编程之美2. 问题描述3. 问题分析对于 这个问题, 书中给出了两种思路 解法一 : 将移动的位数模上数组的长度, 获取最后需要移动的位数[得到移动位数k],...

编程之美:第二章 数字之魅 2.13子数组的最大乘积

/* 子数组的最大乘积: 给定一个长度为N的整数数组,只允许用乘法,不能用除法,计算任意(N-1)个数的组合中乘积最大的一组,并写出算法的时间复杂度 解法1: 计算N-1个数的组合乘积,假设第i个(...

编程之美:第二章 数字之魅 2.18数组分割

/* 数组分割: 有一个无序、元素个数为2*n的正整数数组,要求:如何能把这个数组分割为元素个数为n的两个数组,并使两个子数组的和最接近? 分析: 题目本质是要从2n个整数中找出n个,使得他们的...

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

设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为 O(N), 且只允许使用两个附加变量。 解法一:简单的办法是,每次将数组中的元素右移一位,循环K次。abcd1234 -> 4ab...

编程之美6:数组循环移位

楼主又来~(≧▽≦)/~啦啦啦,科研,就是要这么一鼓作气。额,其实楼主的老本行是推公式啊,做这些算法题,其实是楼主在偷懒。额,话不多说了,快请出我们今天的主角吧!还是关于数组的-数组循环移位。下面我们...

编程之美:第二章 数字之魅 2.15子数组之和的最大值(二维)

/* 子数组之和的最大值(二维): 假设已经确定上下边界,比如知道矩形区域的上下边界分别是第a行和第c行,现在要确定左边界。 把每一列中第a行和第c行之间的元素看成一个整体,即求数组(BC[a],.....
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:编程之美:第二章 数字之魅 2.17数组循环移位
举报原因:
原因补充:

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