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 void reversed(INT ary[],int i,int j)
 7 {
 8     int k=i;
 9     int m=j;
10     for(;k<=m;k++,m--)
11     {
12         INT temp;
13         temp=ary[k];
14         ary[k]=ary[m];
15         ary[m]=temp;
16     }
17     return;
18 }
19
20 void rightshift(INT *ary,int n,int k)
21 {
22     k=k%n;
23     if(k==0)
24         return;
25     reversed(ary,0,n-k-1);
26     reversed(ary,n-k,n-1);
27     reversed(ary,0,n-1);
28 }
29
30 int main()
31 {
32     INT ary[8]={1,2,3,4,5,6,7,8};
33     rightshift(ary,8,4);
34     for(int i=0;i<8;i++)
35         cout<<ary[i]<<‘ ‘;
36     cout<<endl;
37
38     system("pause");
39
40 }
时间: 2025-01-05 05:34:49

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,右移4位,结果变为:1234abcd 思路: 移动前跟移动后是有两段的顺序是不变的,所以可以把这两段看成两个整体 右移K位的过程就是把数组的两部分交换一下. 交换的过程:(1)逆序排列第一部分 (2)逆序排列第二部分 (3)再全部逆序! 代码: #include <iostream> using namespace std; const int MAXN = 10

编程之美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) 把字符串拼接至字