- 浏览: 53927 次
- 性别:
- 来自: 北京
文章分类
最新评论
比如1 2 3 4 5
循环移位1位 5 1 2 3 4
循环移位2位 4 5 1 2 3
循环移位3位 3 4 5 1 2
循环移位4位 2 3 4 5 1
循环移位5位 1 2 3 4 5
可以看出,当移动n位时还原了,数据没有变化。 所以当移动k位>n时,只需移动k%n即可
最简单的方法就是1位1位的移动,如果移动k位,移动k次,但是这样的效率很低,每个数都要移动k次,一共要移动k*n次。
在编程之美上有一种做法,是将前n-k位逆序,在将后k位逆序,4然后将全部n位逆序,这种方法简单,但是每个数要移动两次,一共要移动2n次。
我的方法是每个数只移动一次,但是需要k个存储空间,也就是时间换空间的做法。
就是将前k个数{0,(k)%n,(2k)%n,....}{1,(k+1)%n,(2k+1)%n...}....{ (k-1)%n,(k+k-1)%n...}
有k个子序列,每个子序列分别移动移位,对于第一个子序列也就是说第0位移动到第k位,第k位移动到2k位...对于第二子序列 第1位移动到第k+1位,第k+1位移动到第2k+1位....
按照相同的方法处理。只需要重复k次子序列的移位就可以了
注意:
因为是模运算,子序列可能相交,所以需要记录子序列的移位情况,当该子序列已经移位过了,就要从未移位的子序列中找到一个子序列重新开始。
注意每个子序列的循环移动
循环移位1位 5 1 2 3 4
循环移位2位 4 5 1 2 3
循环移位3位 3 4 5 1 2
循环移位4位 2 3 4 5 1
循环移位5位 1 2 3 4 5
可以看出,当移动n位时还原了,数据没有变化。 所以当移动k位>n时,只需移动k%n即可
最简单的方法就是1位1位的移动,如果移动k位,移动k次,但是这样的效率很低,每个数都要移动k次,一共要移动k*n次。
在编程之美上有一种做法,是将前n-k位逆序,在将后k位逆序,4然后将全部n位逆序,这种方法简单,但是每个数要移动两次,一共要移动2n次。
我的方法是每个数只移动一次,但是需要k个存储空间,也就是时间换空间的做法。
就是将前k个数{0,(k)%n,(2k)%n,....}{1,(k+1)%n,(2k+1)%n...}....{ (k-1)%n,(k+k-1)%n...}
有k个子序列,每个子序列分别移动移位,对于第一个子序列也就是说第0位移动到第k位,第k位移动到2k位...对于第二子序列 第1位移动到第k+1位,第k+1位移动到第2k+1位....
按照相同的方法处理。只需要重复k次子序列的移位就可以了
注意:
因为是模运算,子序列可能相交,所以需要记录子序列的移位情况,当该子序列已经移位过了,就要从未移位的子序列中找到一个子序列重新开始。
注意每个子序列的循环移动
package www.viking.com.algorithm; public class RightShift { /** * @param args */ public static void main(String[] args) { char a[] = { 'a', 'b', 'c', 'd', '1', '2', '3', '4' }; rightshift(a, 4); for (char i : a) { System.out.print(i + " "); } } /** * * @param a * @param steps */ public static void rightshift(char a[], int steps) { // 如果移动a.length位,结果是一样的 steps = steps % a.length; if (steps <= 0) { return; } // 子序列下标 int subSequenceNum = 0; // 起始子序列的下标 int startSequenceNum = 0; // 记录前一个子序列 int preSubSequence = subSequenceNum; // 标示 k个子序列的移位情况 int[] subSequenceShift = new int[steps]; // 从第subSequenceNum元素开始循环右移 // 记录子序列的第一个元素 char moveValue = a[subSequenceNum]; // 子序列的个数 for (int f = 0; f < steps; f++) { // 当前subSequenceNum被移动了 subSequenceShift[subSequenceNum] = 1; // 记录当前位置的值 int j = subSequenceNum; // 右移 for (; j < a.length; j += steps) { char curValue = a[j]; a[j] = moveValue; moveValue = curValue; } // 新的子序列 subSequenceNum = j - a.length; // 判断当前子序列是否被移位过 if (subSequenceShift[subSequenceNum] == 1) { for (; startSequenceNum < subSequenceShift.length; startSequenceNum++) { if (subSequenceShift[startSequenceNum] == 0) { // 子序列循环移位完成,关闭子序列 a[preSubSequence] = moveValue; // 重新设置新的子序列 subSequenceNum = startSequenceNum; // 保存当前的子序列 preSubSequence = subSequenceNum; break; } } } } // 子序列循环移位完成,关闭子序列 a[subSequenceNum] = moveValue; } }
发表评论
-
查找任意两个节点的公共父节点
2011-11-04 00:42 3554基本思路是对需要查找的节点赋权值为1,其它节点权值为0.那么只 ... -
树中任意两个节点之间的距离
2011-11-04 00:28 9624树中任意两个节点之间的距离是指,从一个节点到另一个几点之间的一 ... -
用5,7,12加减运算,求最少步数得到任意数n
2011-11-03 23:59 1269package www.viking.com.algori ... -
线段重合问题
2011-11-01 13:21 2977问题:y=ax+b; 有很多线段{x0,y0,x1,y1}{ ... -
区间覆盖问题
2011-11-01 13:00 1650问题: 有很多区间,比如[1.1,3.4] [1,3] [-1 ... -
最大子矩阵的和
2011-10-25 15:30 763package www.viking.com.algo ... -
最大字段和
2011-10-25 14:43 925package www.viking.com.algo ... -
有重复数的全排列
2011-10-21 18:34 8126有重复数的全排列和全排列的算法是一样的 只不过要去掉重复的序列 ... -
有重复数的组合
2011-10-21 18:33 931package com.viking.divide; ... -
无重复数组合
2011-10-21 18:30 930无重复数的组合问题 就 ... -
m n 全排列
2011-10-21 08:54 849n个字符中长度为m的全排列 public class MN ... -
子集的全排列
2011-10-21 08:51 864比如 123 1 2 3 12 21 13 31 23 32 ... -
google笔试题 人民币问题
2011-10-20 23:57 774方法一:递归方法 对 charge[]={1,5,10,20, ... -
查找无向图中的环
2011-10-19 23:51 1922static int[][] M = { { 0 ... -
无重复数的全排列问题
2011-10-18 09:51 911采用分治思想,很多书都有。。。 这里只是引用一下,因为有很几 ... -
爬台阶问题
2011-10-18 07:57 946package com.viking.dynamic; ... -
查找中间数
2011-10-18 00:21 758package com.viking.divide; ... -
整数的因子分解
2011-10-17 23:21 955package com.viking.divide; ...
相关推荐
### 数组循环移位问题的解法探究 在计算机科学领域,数组作为一种基本的数据结构,在很多算法和数据处理中扮演着重要角色。特别是在涉及到数组元素的移动时,如何高效地进行数组元素的移位操作成为了许多算法研究的...
数组循环移位算法是一种常见的数据操作,特别是在编程竞赛和算法设计中。该算法的主要目标是在一个包含N个元素的数组中,将所有元素向右移动K位,同时保持时间复杂度为O(N),并限制使用有限的额外空间。在本文中,...
题: 如标题,要求时间复杂度为O(N)。解法:右移k位,前k位逆序,后N-k位逆序,再整个逆序即可。 代码如下:#include #include void reverse(int* array, int b, int e) { int temp = 0; for(;...
在for循环中,移位寄存器可以用于生成特定模式的序列,如斐波那契序列或循环移位。在描述中提到“输出图表”,这可能意味着使用移位寄存器生成的数据来绘制统计图形,例如使用Matplotlib库在Python中绘制条形图、...
数组循环左移,也称为数组的旋转操作,是编程中常见的一种数据处理方式。它涉及到在有限的一维数组或向量中,通过指定步长(i)将元素整体向某个方向移动,通常包括向左移位和向右移位。在本例中,我们讨论的是向左...
本研究探讨了如何利用S7-1200 PLC实现数组某一列上下循环移动的控制方法,分别采用梯形图和结构化控制语言两种编程语言来编写程序,并对这两种方法的编程思路和程序解释进行了介绍。 在工业自动控制系统中,数据...
在C语言中,数组的循环移位是一种常见的操作,它涉及到数组元素的重新排列,使得数组元素按照指定的位数向左或向右移动。这种操作在数据处理、位操作和算法实现等领域都有广泛应用。本篇文章将深入探讨如何用C语言...
本篇文章将深入解析“给出数组和移位位数实现循环左移”这一主题,探讨其背后的逻辑、实现方法以及应用场景。 ### 循环左移的概念 循环左移是一种常见的位操作,它将数组或序列中的元素按照指定的位数向左移动,并...
在C语言中,数组元素的循环移位是一种常见的操作,特别是在处理序列数据或者需要实现某种数据变换时。这种操作会将数组中的元素按照一定规则移动,例如,将数组的最末尾元素移动到最前端,其余元素依次后移。本文将...
CODESYS内实现对数组的左移、右移、循环左移和循环右移操作 1、数组右移(SHR) 2、数组左移(SHL) 3、数组循环右移(ROR) 4、数组循环左移(ROL)
数组循环移位是数组操作的一种常见需求。在 Subject06 中,我们需要将一个数组中前 n 个整数,使其前面各数顺序向后移 m 个位置,最后 m 个数变成最前面的 m 个数。这可以通过使用 Java 中的数组索引和赋值操作来...
本主题将深入探讨“三维数组元素上下移位”的概念,这是LabVIEW中对三维数组进行操作的一种常见技巧,特别是在处理多维数据时非常有用。 三维数组可以理解为由多个二维数组组成的集合,每个二维数组称为一个切片。...
LabVIEW程序首先通过设置的串口号与Arduino Uno控制板建立连接,接着将通过For循环将数字管脚D2~D7设置为输出模式,然后进入While循环结构,在While循环中通过一维数组循环移位、移位寄存器和Digital Write Port...
设计思路是基于LED的一维跑马灯原理,通过数组循环移位控制方法实现文本在LED屏上的动态显示。首先,将需要显示的文本通过“获取文本矩形区域”函数和“矩形中绘制文本”函数转化为图像,接着利用“图片至像素图”和...
在C#编程中,"循环移位"是一种常见的操作,特别是在处理数组或列表时,它涉及到元素的重新排列。在给定的标题和描述中,我们可以看到一个具体的例子,它展示了如何将一个数字序列(1到6)进行循环右移。这种操作在...
循环移位数组实现三种数据类型的应用,通常对一个组进行循环移位,看似简单,实际上应用时发现比较麻烦,本案例通过一个的巧妙的方法,轻松解决了这个问题,尤其是用它来实现流水灯的变化非常方便,
### C语言中的循环移位操作 在计算机科学与编程领域,循环移位(或称为循环移位、循环移位)是一种常见的数据处理方法,尤其是在低级编程和算法优化中经常用到。本篇文章将深入探讨如何在C语言中实现循环左移和循环...
标题中的"S7-200SMART通过循环移位实现MODBUS轮询源程序"涉及到的是在西门子S7-200SMART系列PLC中,利用编程技术进行MODBUS通信的一种具体应用。这里的核心是MODBUS轮询,它是MODBUS通信协议中的一种常见操作模式,...