数组循环移动

数组循环移动

个人信息:就读于燕大本科软件工程专业 目前大三;

本人博客:google搜索“cqs_2012”即可;

个人爱好:酷爱数据结构和算法,希望将来从事算法工作为人民作出自己的贡献;

编程语言:C++ ;

编程坏境:Windows 7 专业版 x64;

编程工具:vs2008;

制图工具:office 2010 powerpoint;

硬件信息:7G-3 笔记本;

真言

向前走,不要犹豫,犹豫就是让别人超越自己的最好机会。

题目

数组向右循环移动。

解法

我设计的算法时间复杂度为O(n),空间复杂度为O(1)

算法如下:n为数组长度,k为移动位数(这里的k大有文章)

先考虑如果k<0,那就是向左移动;

在考虑如果k>n,这就是想说明k移动了好多次,确没有必要,如果k == n,那就是移动以后,数组反而没有变化;这时候我们怎么办呢 取k = k%n;

我的算法分为了两种情况

d =  min(k , n-k),

第一种情况是 n % d == 0 (这个需要多找个例子,多尝试,然后可以找到规律)

第二种情况是 n % d != 0(这种情况比较简单)

C++代码表示算法

// 数组循环移位
	void Array::Roat_Right_Array(int *data,unsigned int const length,unsigned int k)
	{
	//异常输入
		if(data == NULL || length == 0 )
		{
			cout<<"异常输入 Roat_Right_Array"<<endl;
		}

	// 正常输入
		else
		{
		// 如果向左移,时要转成向右移
			while(k < 0)
				k += length;
			k = k % length ;

		// 如果移动后整个数组没变,那就不需要移动,否则需要移动,如下
			if(k != 0)
			{
				int min = (k < (length/2))? k:length-k;

			// 能整除,意思是 不是一条龙
				if(length % min == 0)
				{
					int dlater,dbefore;
					for(int j=0;j<min;j++)
					{
						dlater = data[(j+k)%length];
						dbefore =data [j];
						for(unsigned int m=0,i=j;m < (length/min);m++)
						{
							data[(i+k)%length] = dbefore;
							i = (i+k)%length;
							dbefore = dlater;
							dlater = data[(i+k)%length];
						}
					}
				}

			// 不能整除,意思是 一条龙
				else
				{
					int dbefore= data[0],dlater = data[k%length];
					for(unsigned int i=0,j=0;i<length;i++)
					{
						data[(j+k)%length] = dbefore;
						j = (j+k)%length;
						dbefore = dlater ;
						dlater = data[(j+k)%length];
					}
				}
			}

		}

	}

数组循环移动,布布扣,bubuko.com

时间: 2024-08-06 11:31:22

数组循环移动的相关文章

《编程珠玑》笔记:数组循环左移

问题描述:数组元素循环左移,将包含 num_elem 个元素的一维数组 arr[num_elem] 循环左移 rot_dist 位.能否仅使用数十个额外字节的存储空间,在正比于num_elem的时间内完成数组的旋转? 一:Bentley's Juggling Alogrithm 移动变量 arr[0] 到临时变量 tmp,移动 arr[rot_dist] 到 arr[0],arr[2rot_dist] 到 arr[rot_dist],依此类推,直到返回到取 arr[0] 中的元素,此时改为从 t

线性表(一)&mdash;&mdash;数组循环右移算法

源码:rshift.cpp #include "stdafx.h" #include <stdio.h> /************************************************************************/ /* 数组循环右移算法 */ /************************************************************************/ /* * 要求:只用一个元素大小的辅助空间

数组循环右移

Q:把一个含有 N 个元素的数组循环右移 K 位,要求时间复杂度为 O (N),且只允许使用两个附加变量. 开始的思路: 1.若k=整数倍N, 完成:k大于N,k=N%k:k小于N,开始处理. 2.tmp1保存取出的元素a[k]:a[0]放在k:tmp2保存a[2k], tmp1放入2k:tmp1保存a[3k],tmp2放入3k...直到位置[0]被放入一个新值,一轮循环完毕.这是一个从位置[0]出发,又回到位置[0]的接龙游戏. 仔细考虑下,发现,若N%k==0,则需要从[0]开始,[0]结束

数组循环右移问题

首先,假设我们有一个具有6个元素的数组: 1,2,3,4,5,6 现在我们要对这个数组循环右移4次,我们很直接很够推出它的结果是:3,4,5,6,1,2 .但是我们如何去实现这样一个问题呢? 我觉得大家最容易想到的方法就是: step1:保存好数组中最后一个元素的值 step2:从第一个元素到倒数第二个元素依次向右移动一个位置 step3:然后将刚保存的值放到空出来的数组第一个位置 虽然这个方法想起来很简单,但是它的效率却不是很高,它的时间复杂度是O(n^2). 现在,我再介绍一种效率较高的算法

Javascript 数组循环遍历之forEach

Javascript 数组循环遍历之forEach 数组循环变量,最先想到的就是 for(var i=0;i<count;i++)这样的方式了. 除此之外,也可以使用较简便的forEach 方式 2.  forEach 函数. Firefox 和Chrome 的Array 类型都有forEach的函数.使用如下: [html] view plain copy <!--Add by oscar999--> <!DOCTYPE HTML PUBLIC "-//W3C//DTD

java-第七章-数组-循环输出

public class A01 { public static void main(String[] args) { // TODO Auto-generated method stub String name [] = new String []{"Nike背包","Adidas运动衫","李宁运动鞋","Kappa外套","361°腰包"}; System.out.println("本次活动

快学Scala 第三课 (定长数组,变长数组, 数组循环, 数组转换, 数组常用操作)

定长数组定义: val ar = new Array[Int](10) val arr = Array("aa", "bb") 定长数组赋值: arr(0) = "cc" 变长数组定义: val ab = new ArrayBuffer[String]() val ab1 = ArrayBuffer[String]() 定长数组增加元素: ab += "aa" ab += ("bb", "cc&q

(转)数组循环右移

设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量. 不合题意的解法如下: 我们先试验简单的办法,可以每次将数组中的元素右移一位,循环K次.abcd1234→4abcd123→34abcd12→234abcd1→1234abcd.伪代码如下: 代码清单2-33 RightShift(int* arr, int N, int K) { while(K--) { int t = arr[N - 1]; for(int i = N - 1; i >

JS数组循环的两种方法

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"> <head> <meta h