1008 数组元素循环右移问题

来源:互联网 发布:网络美术培训 编辑:程序博客网 时间:2024/06/05 15:05
// ---------------------------------------1008-------------------------------------------// 一个数组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#include <stdio.h>#include <malloc.h>int main(void){int num, step;// num代表数组容量,step代表右移步数scanf("%d %d", &num, &step);// 处理第一行输入getchar();step = step % num;// 注意是循环右移,即用户输入的step可能大于或等于numint * nums = (int *)malloc(num * sizeof(int));// 创建一个容量为num的数组,名为numsfor (int i = step; i < num; i++)// 处理用户第二行输入scanf("%d", nums + i);// 在处理输入时就完成了数组的右移for (int i = 0; i < step; i++)scanf("%d", nums + i);getchar();for (int i = 0; i < num; i++)// 输出数组{printf("%d", nums[i]);if (i != num - 1)printf(" ");}        free(nums);return 0;}// 该题其实是个简单题,个人体会要点有两个// 1:要认真领会题意,考虑到题意范围内的所有可能的用户输入,重要的是一定要能想到那些反直觉的可能的输入,比如这道题中,新手不会认识到用户输入的step可能大于或等于num// 2:要认真理解“黑箱子”,题目的描述性引导很多时候是一种不好的诱导。做题的过程就是在造黑箱子,只看输入与结果,程序执行的过程是否按题目所诱导的方向来进行,这不重要。// 第2点上,本题题目传达给解题者一个信号“用户输入了一个数组,要把这个数组进行右移处理”,在该解答中,事实上我们并没有处理数组,只是在处理用户输入的时候就完成了所谓的右移// 要多想,多练,多写注释,在简单题中能领会一点东西的话,那么这道题即使花了两个小时去拧巴,也是值得的


0 0