陣列迴圈移位
問題描述:
對於一個含有n個元素的陣列a,將它的所有元素向後移動k位。
解決方案:
1、最笨最直接的方法,就是把陣列移動k次,每一次都把陣列的所有元素向後移動一位,時間複雜度為O(k*n)。具體程式碼如下:
void First_kind(int a[],int n,int k)
{
k%=n;
while(k--)///////////////移動k次,每次都將所有元素向後移動一位。
{
int t=a[n-1];
for(int i=n-1;i>0;i--)
a[i]=a[i-1];
a[0]=t;
}
}
2、可以用空間換時間的思想對方法1進行優化,即另外開闢一個一樣大的陣列b,把a移位複製到b,再逐個把元素賦值到a。時間複雜度為O(n)。具體程式碼如下:
void Second_kind(int a[],int n,int k)
{
int b[256];
for(int i=0;i<n;i++)
b[i]=a[(i-k+n)%n];/////////////////////將陣列a的元素移位後賦給b
for(i=0;i<n;i++)
a[i]=b[i];
}
3、對方法1進行更進一步的優化,我們可以只移動一次,將每個元素一次向後移動k位,時間複雜度為O(n)。
例如a={1,2,3,4,5,6,7,8},n=8,要向後移k=3位。則先令t=a[0],然後a[0]=a[(0-3+8)%8]=a[4],a[4]=[(4- 3+8)%8]=a[1],,,即a[i]=a[(i-k+n)%n]。
注意:當k=4時,t=a[0],a[0]=a[4],a[4]=t。此時如果還是i=(i-k+n)%n的話將產生重複移位。此時應該令i=j+1(j為 移位的起始位置)開始繼續移位,即t=a[1],a[1]=a[5],a[5]=t。。。。。
具體程式碼如下:
void Third_kind(int a[],int n,int k)
{
int i,j,t,m;////////////////////////////t用來存放起始的元素值,j用來存放起始的位置,m用來記錄移動的元素數,當m==n時表示移動完成。
k%=n;
for(m=i=j=0,t=a[i];m<n;m++)
{
if((i-k+n)%n==j)///////////////////如果i的下一個結點是j,但j元素已經移動過了的,值在t裡面,則令a[i]=t,i從j+1的位置繼續移動。
{
a[i]=t;
i=++j;
t=a[i];
continue;
}
a[i]=a[(i-k+n)%n];
i=(i-k+n)%n;
}
}
4、這種方法算是通過取巧的方法,比較少人會想到。時間複雜度也是O(n)。
例如a={1,2,3,4,5,6,7,8},n=8,要向後移k=3位。我們可以按如下步驟移:
a、將陣列分成兩段,"1,2,3,4,5" 和 "6,7,8"
b、把這兩段分別逆序,則a陣列變成"5,4,3,2,1,8,7,6"
c、把陣列a整段逆序,則a變成了"6,7,8,1,2,3,4,5",這不就是我們要的答案了嗎!
具體程式碼如下:
void Change(int *a,int i,int j)//////////////////////////函式Change實現陣列a從i元素到j元素逆序。
{
for(;i<j;i++,j--)
{
int t=a[i];
a[i]=a[j];
a[j]=t;
}
}
void Fourth_kind(int *a,int n,int k)
{
Change(a,0,n-k-1);
Change(a,n-k,n-1);
Change(a,0,n-1);
}
轉載請註明出處,謝謝!(原文連結:http://blog.csdn.net/bone_ace/article/details/41173393)
相關文章
- 陣列迴圈陣列
- 陣列迴圈輸出陣列
- awk 陣列和迴圈陣列
- for..in 迴圈陣列需注意陣列
- php陣列迴圈遍歷PHP陣列
- js陣列迴圈方法對比JS陣列
- 陣列元素迴圈右移問題陣列
- 迴圈陣列最大子段和陣列
- linux awk 陣列和迴圈Linux陣列
- 靜態佇列,迴圈陣列實現佇列陣列
- while迴圈和do迴圈、緩衝區、一維陣列While陣列
- 陣列常見的遍歷迴圈方法、陣列的迴圈遍歷的效率對比陣列
- 手擼MQ訊息佇列——迴圈陣列MQ佇列陣列
- for迴圈訪問php的索引陣列PHP索引陣列
- php 迴圈陣列引用傳值改變陣列本身的值PHP陣列
- js陣列操作--使用迭代方法替代for迴圈JS陣列
- JavaScript 中 for in 迴圈和陣列的問題JavaScript陣列
- Go_ if else語句 ,,迴圈,,switch,,陣列Go陣列
- 457. 環形陣列是否存在迴圈陣列
- 習題8-3 陣列迴圈右移 及 練習7-8 方陣迴圈右移陣列
- for迴圈無法刪除陣列所有指定元素陣列
- Josephus問題解決方法四(迴圈陣列)陣列
- 《程式設計珠璣》第二章-迴圈移位程式設計
- 在迴圈陣列時使用splice()方法刪除陣列遇到的問題陣列
- ASP.NET Razor – VB 迴圈和陣列簡介ASP.NET陣列
- Go 處理大陣列:使用 for range 還是 for 迴圈?Go陣列
- foreach迴圈和記憶體中的陣列記憶體陣列
- 用一層for迴圈初始化三維陣列陣列
- 微控制器C語言實現迴圈移位 (轉)C語言
- JS使用迴圈按指定倍數分割陣列組成新的陣列的方法JS陣列
- 佇列 和 迴圈佇列佇列
- 迴圈陣列最大欄位和(51Nod-1050)陣列
- ASP.NET Razor – C# 迴圈和陣列簡介ASP.NETC#陣列
- C 語言實現使用靜態陣列實現迴圈佇列陣列佇列
- C 語言實現使用動態陣列實現迴圈佇列陣列佇列
- PHP通過迴圈來檢測四維陣列中的值是否存在陣列中PHP陣列
- ORM 如何不用迴圈只返回表中單列的陣列集合 - pluckORM陣列
- [PAT B] 1008 陣列元素迴圈右移問題陣列