數組循環左移


7-1 數組循環左移 (20分)
本題要求實現一個對數組進行循環左移的簡單函數:一個數組a中存有n(>)個整數,在不允許使用另外數組的前提下,將每個整數循環向左移m(≥)個位置,即將a中的數據由(a​0​​a​1​​⋯a​n−1​​)變換為(a​m​​⋯a​n−1​​a​0​​a​1​​⋯a​m−1​​)(最前面的m個數循環移至最后面的m個位置)。如果還需要考慮程序移動數據的次數盡量少,要如何設計移動的方法?

輸入格式:
輸入第1行給出正整數n(≤)和整數m(≥);第2行給出n個整數,其間以空格分隔。

輸出格式:
在一行中輸出循環左移m位以后的整數序列,之間用空格分隔,序列結尾不能有多余空格。

輸入樣例:
8 3
1 2 3 4 5 6 7 8
 
輸出樣例:
4 5 6 7 8 1 2 3

 

 

算法解釋:

1 下面的算法,用來將數組a[n]的每個元素都循環地左移k 位,這里1≤k≤n。
2 算法描述如下:
3 步驟1) 將數組分成兩段,左段長為k,右段長為n-k。
4 步驟2) 分別將兩段逆轉(即元素排列次序與原次序相反)。
5 步驟3) 再數組元素整體逆轉。
6 
7 <注1>如果是右移k位,步驟1改為“ 將數組分成兩段,左段長為n-k,右段長為k。”
8 <注2>任一數組元素a[i]經左移算法處理后,其下標變成:(i+m)%n。相當於一開始左移m%n位。

 

C語言代碼:

#include <stdio.h>
int main(int argc, const char *argv[])
{
    int a[101], i, j, n, m;
    scanf("%d %d", &n, &m );
    for(i=0; i<n; i++)
        scanf("%d", &a[i]);
    m = m%n;/*考慮m比n大的情況,即左移出現循環。如8位數左移10位,相當於左移2位;
                                          8位數左移10位,相當於左移0位。*/
    for(i=0; i<m/2; i++)         //前m個數倒序排列
    {
        j=a[(m-1)-i];
        a[(m-1)-i]=a[i];
        a[i]=j;
    }
    for(i=0; i<(n-m)/2; i++)    //后(n-m)個數倒序排列
    {
        j=a[(n-1)-i];
        a[(n-1)-i]=a[m+i];
        a[m+i]=j;
    }
    for(i=0; i<n/2; i++)        //整體再倒序排列。左移完成
    {
        j=a[(n-1)-i];
        a[(n-1)-i]=a[i];
        a[i]=j;
    }
    for(i=0; i<n-1; i++)        //輸出循環左移m位以后的整數序列,之間用空格分隔,序列結尾不能有多余空格。
    {
        printf("%d ",a[i]);
    }
    printf("%d",a[n-1]);
    return 0;
} 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM