1. 程式人生 > >把一個含有N個元素的陣列迴圈右移K位,要求時間複雜度為O(N)

把一個含有N個元素的陣列迴圈右移K位,要求時間複雜度為O(N)

分析與解法

假設原陣列序列為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);
}
}
}