分析与解法
假设原数组序列为abcd1234,要求变换成的数组序列为1234abcd,即循环右移了4位,比较之后,不难看出,其中有两段的顺序是不变的:1234和abcd,可把两段看成两个整体。右移K位的过程就是把数组的两部分交换一下。变换过程通过以下步骤完成:
1.逆序排列 abcd: abcd1234 -> dcba1234;
2.逆序排列 1234: dcba1234-> dcba4321;
3.全部逆序 dcba4321->1234abcd。
C# Codes
using System;
namespace ConsoleApp2
{
class Program
{
static void Main(string[] args)
{
int[] array ={ 1, 2, 3, 4, 5, 6, 7, 8, 9};
RightShift(array, 5);
foreach (int i in array)
{
Console.WriteLine(i);
}
Console.ReadKey();
}
static void Reserve(int[] array, int startIndex, int endIndex)
{
for (int i = 0; i < (endIndex - startIndex + 1) / 2; i++)
{
int mark = array[startIndex + i];
array[startIndex + i] = array[endIndex - i];
array[endIndex - i] = mark;
}
}
static void RightShift(int[] array, int shiftNum)
{
shiftNum %= array.Length;
if (shiftNum <= 0)
{
return;
}
Reserve(array, 0, shiftNum - 1);
Reserve(array, shiftNum, array.Length - 1);
Reserve(array, 0, array.Length - 1);
}
}
}
分享到:
相关推荐
数据结构教程(JAVA语言描述) 设计一个算法,将含有n个整数元素的数组a[0..n-1]循环右移m位,要求算法的空间复杂度为O(1)
5.18⑤ 试设计一个算法,将数组A中的元素 A[0..n-1]循环右移k位,并要求只用一个元素 大小的附加存储,元素移动或交换次数为O(n)。 要求实现以下函数:
时间复杂度为O(n)的找中位数算法源代码
数组循环右移代码,PAT原题,复杂度小很多
数组和链表的时间复杂度 (1) 数组和链表.pdf
分治算法求n个数的数组中找出第二个最大元素
(1)设X[0:n-1]和Y[0:n-1]为两个数组,每个数组中含有n个已排好序的数,设计一个算法复杂度为O(logn)的分治算法,找出X和Y中2n个数中的中位数。(中位数:个数为奇数:中间位置上的数;个数为偶数,中间两个数的...
求解找到数组A[1..n]中元素的最大值和次最大值(本小题以数组元素的比较为标准操作)的算法,并分析其最坏情况的时间复杂度。
创建一个顺序表,存放在数组A[N]中,元素的类型为整型,设计算法调整A,使其左边的所有元素小于0,右边的所有元素大于0(要求算法的时间复杂度和空间复杂度均为O(n))。
寻找数组中第k大的元素,基于快速排序思想,实践复杂度为O(n)
一个C程序 实现了单链表的逆序 且复杂度为O n
堆排序 归并排序 选择排序 快速排序 插入排序 可选择数组初始状态(随机、正序、逆序) 通过输出的时间可以更好地比较在不同数组状态下 各种排序算法的时间复杂度
题目描述:将长度为N的数组arr循环右移K位,给出最高效的算法 //最高效的循环右移算法!! //这个是递归的写法 //author:tengzhao201 QQ:715572192 //time:2010-4-24 //时间复杂度为O(n),空间复杂度O(1),交换点在...
请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n))。 你可以假设 nums1 和 nums2 不会同时为空。 示例 1: nums1 = [1, 3] nums2 = [2] 则中位数是 2.0 示例 2: nums1 = [1, 2] ...
.求子数组的最大和 题目: 输入一个整形数组,数组里有正数也有负数。...要求时间复杂度为O(n)。 例如输入的数组为1, -2, 3, 10, -4, 7, 2, -5,和最大的子数组为3, 10, -4, 7, 2, 因此输出为该子数组的和18。
数据结构时间复杂度
算法设计与分析(王晓东版)2-11题:将数组的子数组a[0:k]和a[k+1:n-1]进行换位,要求最坏情况下时间复杂度为O(n)
根号n段归并排序算法时间复杂度分析过程: 1.合并 根号n向下取整 段子数组使用的是自底向上两两归并的策略 2.根号n段归并排序算法时间复杂度的数学推导
前缀和 利用前缀和来求随时间变化的数组和,来减小时间复杂度