题目:http://pat.zju.edu.cn/contests/pat-b-practise/1008
该题目想到两种实现方法:
<1>不断循环右移;
<2>分情况分段左右移,但提交有一个测试点没通过。
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace PAT_1008
{
class Program
{
static void Main(string[] args)
{
int N, M;
string input = Console.ReadLine();
string[] inputs = input.Split(' ');
N = Int32.Parse(inputs[0]);
M = Int32.Parse(inputs[1]);
int[] data = new int[N];
input = Console.ReadLine();
inputs = input.Split(' ');
for (int i = 0; i < N; i++)
{
data[i] = Int32.Parse(inputs[i]);
}
int[] data1 = new int[N];
int[] data2 = new int[N];
data.CopyTo(data1,0);
data.CopyTo(data2, 0);
data1 = MoveRight(data1, M);
PrintData(data1);
Console.Write("\n");
data2 = MoveRight2(data2,M);
PrintData(data2);
Console.ReadKey();
}
/// <summary>
/// 右移数组
/// </summary>
/// <param name="data"></param>
/// <param name="M"></param>
/// <returns></returns>
private static int[] MoveRight(int[] data, int M) //N*M
{
int temp,N=data.Length;
for (int i = 1; i <= M; i++)
{
temp = data[N-1];
for (int j = N-1; j >0; j--)
{
data[j] = data[j - 1];
}
data[0] = temp;
}
return data;
}
private static int[] MoveRight2(int[] data, int M)
{
int temp, N = data.Length;
if (M == 0||M==N)
{
return data;
}
else if (M == N-M) //移动次数1.5*N
{
for (int i = 0; i < M; i++)
{
temp = data[i];
data[i] = data[i+M];
data[i+M] = temp;
}
return data;
}
else if (M < N-M)
{
for (int i = 0; i < (int)((N - M) / M); i++)
{
for (int j = N - i * M - 1; j > N - (i + 1) * M - 1; j--)
{
temp = data[j];
data[j] = data[j - M];
data[j - M] = temp;
}
}
for (int i = 1; i <= (int)(N % M); i++)
{
temp = data[0];
for (int j =1; j < N%M+M; j++)
{
data[j-1] = data[j];
}
data[N % M + M - 1] = temp;
}
return data;
}
else
{
for (int i = 0; i < (int)(M / (N - M)); i++)
{
for (int j = i*(N-M); j < (i+1)*(N-M); j++)
{
temp = data[j];
data[j] = data[j + N - M];
data[j + N - M] = temp;
}
}
for (int i = 1; i <= M % (N - M); i++)
{
temp = data[N - 1];
for (int j = N - 1; j > M - M % (N - M) ; j--)
{
data[j] = data[j - 1];
}
data[M - M % (N - M)] = temp;
}
return data;
}
}
/// <summary>
/// 打印数组
/// </summary>
/// <param name="data"></param>
private static void PrintData(int[] data)
{
for (int i = 0; i < data.Length - 1; i++)
{
Console.Write("{0} ", data[i]);
}
Console.Write(data[data.Length - 1]);
}
}
}