アルゴリズム基礎練習1:配列要素ループ右シフト問題
858 ワード
题目:1つの配列AにはN(>0)個の整数が存在し、他の配列を使用することが許されない前提の下で、各整数サイクルをM(≧0)個の位置に右にシフトし、A中のデータを(A 0,A 1,...AN-1)から(AN-M,...AN-1,A 0,A 1,...AN-M-1)に変換する(最後のM個の数サイクルが一番前のM個の位置にシフトする).プログラムがデータを移動する回数を最小限に抑える必要がある場合は、どのように移動方法を設計しますか?
入力フォーマット:各入力は1つのテスト例を含み、1行目はN(1≦N≦100)とM(≧0)を入力する.2行目にN個の整数を入力し、間をスペースで区切ります.
≪出力フォーマット|Output Format|emdw≫:1行にMビットを右にシフトした後の整数シーケンスを出力します.間はスペースで区切られ、シーケンスの最後に余分なスペースは使用できません.
サンプルを入力:
6 2 1 2 3 4 5 6出力サンプル:
5 6 1 2 3 4
考え方:1.まずM番目のビットから配列2にデータを入力.配列の後Mビットは、前Mビット3に一度移動する.複雑度:N;
入力フォーマット:各入力は1つのテスト例を含み、1行目はN(1≦N≦100)とM(≧0)を入力する.2行目にN個の整数を入力し、間をスペースで区切ります.
≪出力フォーマット|Output Format|emdw≫:1行にMビットを右にシフトした後の整数シーケンスを出力します.間はスペースで区切られ、シーケンスの最後に余分なスペースは使用できません.
サンプルを入力:
6 2 1 2 3 4 5 6出力サンプル:
5 6 1 2 3 4
考え方:1.まずM番目のビットから配列2にデータを入力.配列の後Mビットは、前Mビット3に一度移動する.複雑度:N;
#include "stdio.h"
void main()
{
int N, M;
scanf("%d %d
",&N,&M);
int a[10000];
for(int i = 0;i < N; i++)
{
scanf("%d",a+i+M);
}
for(int k = 0;k < M; k++)
{
a[M-k-1]=a[N+M-k-1];
}
for(int j = 0;j < N; j++)
{
printf(" %d",a[j]);
}
}