场景

  • 使用 Python 解决 PAT . 1008, 提交后测试结果中存在 “格式错误” 问题。
  • 分析、定位问题,提交正确结果。

问题描述

1008 . 数组元素循环右移问题 (20)

一个数组A中存有N(N>0)个整数 , 在不允许使用另外数组的前提下 ,将每个整数循环向右移 M(M>=0) 个位置,即将A中的数据由 (A0 A1……AN-1) 变换为 (AN-M …… AN-1 A0 A1……AN-M-1) (最后M个数循环移至最前面的M个位置)。 如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?

输入格式 : 每个输入包含一个测试用例,第1行输入N ( 1<=N<=100)、M(M>=0);第2行输入N个整数,之间用空格分隔。

输出格式 : 在一行中输出循环右移M位以后的整数序列,之间用空格分隔,序列结尾不能有多余空格。

输入样例
6 2
1 2 3 4 5 6

输出样例
5 6 1 2 3 4


思路

  • 空格分片
  • 平移下标后,空格连接 ( join )

代码片 1 ( 格式错误 15分

# Python 1
nums_str=input().split(' ') # 读入数据
total,cout=int(nums_str[0]),int(nums_str[1])

num_lis=input().split(' ')
diff=total-cout%total if total<cout else total-cout

print(' '.join(num_lis[diff:total])+' '+' '.join(num_lis[0:diff])) # 结果数据
  • 错误原因:
  • 忽略 M 为 0 的情况,即 平移 0 个单位 .
  • 因此,测试点中才会存在 格式错误

代码片 2 ( 正确结果 20分

# Python 2
nums_str=input().split(' ') # 读入数据
total,cout=int(nums_str[0]),int(nums_str[1])

num_lis,diff=input().split(' '),total-cout

print((' '.join(num_lis[diff:total])+' '+' '.join(num_lis[0:diff])).strip()) # 结果数据

代码片 3 ( 正确结果 20分

// C 语言

#include<stdio.h>
#include<stdlib.h>

// 平移函数
void shift_for_m(int tar[], int N, int M) {
int j=0,tmp=0;
if (M>N) { // 如果 M大于N,取余
M=M%N;
}

for(int i=0; i<M; i++){
tmp=tar[N-1]; // 尾数
for(j=N-2; j>=0; j--){ // 每次平移
tar[j+1]=tar[j];
}
tar[0]=tmp; // 首位赋值
}
}

// 打印函数
void print_arrays(int tar[], int size){
for(int j=0; j<size; j++){
printf(j==size-1 ? "%d" : "%d ", tar[j]);
}
}

int main(void){

int arrays[100],N=0,M=0;

scanf("%d %d", &N,&M); // 循环打印数据
for(int k=0; k<N; k++)
scanf("%d", &arrays[k]);

shift_for_m(arrays, N, M);
print_arrays(arrays, N);

return 0;
}