2.17 数组循环移位

题目:把一个含有N个元素的字符串右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量。

例子:

字符串为:abcd1234,右移4位,结果变为:1234abcd

思路:

移动前跟移动后是有两段的顺序是不变的,所以可以把这两段看成两个整体

右移K位的过程就是把数组的两部分交换一下。

交换的过程:(1)逆序排列第一部分

(2)逆序排列第二部分

(3)再全部逆序!

代码:

#include <iostream>

using namespace std;

const int MAXN = 10000;
int Array[MAXN], n, k;

void Reverse(int *A, int b, int e) {
	for(; b < e; ++b, --e) {
		int temp = A[b];
		A[b] = A[e];
		A[e] = temp;
	}
}

void RightShift(int *A, int n, int k) {
	k %= n;
	Reverse(A, 0, n-k-1);
	Reverse(A, n-k, n-1);
	Reverse(A, 0, n-1);
}

int main() {
	cin >> n >> k;
	for(int i = 0; i < n; ++i) cin >> Array[i];
	RightShift(Array, n, k);
	for(int i = 0; i < n; ++i) cout << Array[i];
	cout << endl;
	return 0;
}
时间: 2024-08-04 14:24:30

2.17 数组循环移位的相关文章

编程之美2.17 数组循环移位

问题描述: 设计一个算法,把一个含有N元素的数组循环左移或者右移K位. 解决方法: 1. 暴力解法------O(KN) 2. 颠倒位置------O(N) 具体思路和代码: 1. 暴力解法------O(KN) 思路:循环K次,每次移动一位 代码: 1 //右移 2 void s1(int A[], int n, int k) 3 { 4 k = k % n; 5 for(int i = 0; i < k; i++) 6 { 7 int t = A[n-1]; 8 for(int j = n-

2.17——数组循环移位

题目: 设计一个算法,将一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),只允许使用两个附加变量 思路: 如abcd1234: 逆序排列abcd:abcd1234--->dcba1234 逆序排列1234:dcba1234--->dcba4321 逆序所有       :dcba4321--->1234abcd 下面是代码: 1 #include<iostream> 2 using namespace std; 3 4 typedef int INT; 5 6 v

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

题目: 把一个含有N个元素的额数组循环右移K位,要求时间复杂度O(N),且只允许使用两个附加变量. 解法一:O(N^2) 每次将数组中的元素右移移位,循环K次.当K>N时,右移K位和右移K%N位是一样的. MyShift(int a[],int N,int K) { K%=N; while(K--) { int t=a[N-1]; for(int i=N-1;i>0;i--) a[i]=a[i-1]; a[0]=t; } } 解法二:O(N) 假如数组abcd1234 1.逆序abcd:abc

转:数组循环移位

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

[.net 面向对象编程基础] (17) 数组与集合

[.net 面向对象编程基础] (17) 数组与集合 学习了前面的C#三大特性,及接口,抽象类这些相对抽象的东西以后,是不是有点很累的感觉.具体的东西总是容易理解,因此我们在介绍前面抽象概念的时候,总是举的是具体的实例以加深理解. 本节内容相当具体,学起来也相当轻松. 1.数组 1.1 什么是数组? 数组是一种数据结构,包含同一个类型的多个元素. 1.2数组的初始化 string[] mystringArray; 类型+方框号 数组名 1.3数组初始化 我们知道数组是引用类型,所以需要给他分配堆

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

楼主又来~(≧▽≦)/~啦啦啦,科研,就是要这么一鼓作气.额,其实楼主的老本行是推公式啊,做这些算法题,其实是楼主在偷懒.额,话不多说了,快请出我们今天的主角吧!还是关于数组的-数组循环移位. 下面我们来看下题目的要求. 题目要求: 设计一个算法,把一个含有N个元素的数组循环右移K位,要求时间复杂度为O(N),且只允许使用两个附加变量. 题目解答 我们来自己给个例子,来帮助自己思考.如数组为[1, 2, 3, 4, 5, 6, 7, 8],循环移位4次. 原始序列:[1, 2, 3, 4, 5,

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

题目描述:设计一个算法,把一个含有N个元素的数组循环右移K位,要求算法的时间复杂度位O(Log2N),且只允许使用两个附加变量. 什么意思呢,就是说如果输入序列为:abcd1234,右移2位即变为34abcd12.唯一的要求就是使用两个附加变量. 其实这道题编程珠玑上面也出现过,书中给出的一种符合题意的解法是巧妙地进行翻转.以把abcd1234右移4位为例: 第一步:翻转1234,abcd1234---->abcd4321 第二步:翻转abcd,abcd4321---->dcba4321 第三

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

题目:一个有N个元素的数组 循环右移k位 要求时间复杂度O(N)  只允许两个附加变量 abcd1234 循环右移4位  变成 1234abcd 做过 思路  (ATBT)T = BA 注意,K可能比N大,K也可能是负数(左移),要注意取余处理!! #include <stdio.h> #include <string.h> void exchange(char * c, int begin, int end) { char tmp; for(; begin < end; b

7.17 数组(二维数组) Day10

---note--- 二维数组: 数组名 [下标] [下标] a[2][3] b[1][2]=a[3][4]/2 int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}}: 字符数组: char c[10]; c[0]="I" 空不等于没有数据 strcpy(字符串1,字符串2) 左对齐直接覆盖 strcpy(str1,str2,2) 只把str2的前两个字符覆盖至str1 strcat 一般形式:strcat(字符数1,字符数2) 把字符串拼接至字