下面的算法(文字叙述形式),用来将数组a[n]的每个元素都循环地右移k位,这里1≤h≤n。算法描述如下:步骤1)将数组分成两段,左段长为n-k,右段长为k。步骤2)分别将
⑵ 已知数组A[n]中的元素为整型,设计算法将其调整为左右两部分,左边所有元素为奇数,右边所有元素为偶数,并要求算法的时间复杂度为O(n)。 [解答]从数组的两端向中间比较,设置两个变量i和j,初始时i=0,j=n-1,若A[i]为偶数并且A[j]为奇数,则将A[i]与A[j]交换。 分析算法,两层循环将数组扫描一遍,所以...
试设计一个算法,将数组An 中的元素A[0]至A[n-1]循环右移k位,并要求只用一个元素大小的附加存储,元素移动或交换次数为O(n)解:分析:要把A的元素循环右移k位,
试设计一个算法,将数组A。中的元素A[0]至 A[n-1] 循环右移k位,并要求只用一个元素大小的附加存储,元素移动或交换次数为O(n)。 答案 本题难点在于找到O(n)的算法。注意分析研究此问题的数学性质,以寻求好的算法。本题有多种解法,但要注意不要将在特殊条件下出现的现象当作一般规律。例如,本题易犯...
数组 循环位移 或 循环移动 (左移 或 右移) K位 指定一个数组,比如整数或字符串, 长度为N, 将其循环右移K位. 以下是我的解法: 只需要遍历一次数组即可. 空间复杂度是o(1), 时间复杂度是o(N). 不同于其他的解法: 1) 不需要求GCD(N,K)
假设原数组序列为abcd1234,要求变换成的数组序列为1234abcd,即循环右移了4位。比较之后,不难看出,其中有两段的顺序是不变的:1234和abcd,可把这两段看成两个整体。右移K位的过程就是把数组的两部分交换一下。变换的过程通过以下步骤完成: 1. 逆序排列abcd:abcd1234 → dcba1234; ...
数组的循环右移K位算法,仅使用一个附加的空间,交换次数或元素移动时间复杂度为O(n); /*步骤分为三步:(K=2) 1.将第 1 位至第 N-K 位进行反转;1,2,3, 4,5->3,2,1, 4,5 2.将第 N-K+1 位至第 N 位进行反转;3,2,1, 4,5->3,2,1, 5,4 ...
高级解法(线性时间):假设原数组序列为abcd1234,要求变换成的数组序列为1234abcd,即循环右移了4位。比较之后,不难看出,其中有两段的顺序是不变的:1234和abcd,可把这两段看成两个整体。右移K位(即右移K = K % N位)的过程就是把数组的两部分交换一下。变换的过程通过以下步骤完成: ...
将数组循环右移k位 将长度为n数组循环右移k(范围1到n)位 方法一 思考: 找每个元素a[i]的最终所在位置,直接放上去,但是放上去前需要先将放置位置元素保存,然后找被保存元素的最终所在位置...一直循环到a[i]结束。 为了提高效率,可以倒着处理,这样元素a[i]只需要暂存一次。将a[i]暂存,到最终要放到i位置...
算法设计⑴ 设计一个时刻复杂度为O(n)的算法,实现将数组A[n]中所有元素循环右移k个位置。[解答]算法思想请参见主教材第一章思想火花。下面给出具体算法。分析算法,第一次挪用Reverse函数的时刻复杂度为O(k),第二次挪用Reverse函数的时刻复杂度为O(n-k),第三次挪用Reverse函数的时刻复杂度为O(n),因此,总...