我是靠谱客的博主 温暖冬日,最近开发中收集的这篇文章主要介绍PAT乙类1008之数组元素循环右移问题一、题目二、代码,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

一、题目

一个数组A中存有N(>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(≥0)个位置,即将A中的数据由(A​0A1⋯AN−1变换为(A​N−M⋯A​N−1A0A​1⋯A​N−M−1)(最后M个数循环移至最前面的M个位置)。如果需要考虑程序移动数据的次数尽量少,要如何设计移动的方法?
输入格式:
每个输入包含一个测试用例,第1行输入N(1≤N≤100)和M(≥0);第2行输入N个整数,之间用空格分隔。

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

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

二、代码

方法一:(使用了额外的数组,但是是自己想的)

  • 新的函数
    没有
    *核心思想
  1. 本题中要求向右移动m个位置, 我们很容易根据(m+i)%n求出移动后的位置,但是a[i]的元素该何去何从??
    之后我发现,我们只需要将a[0] ~ a[n] 循环移动,(移动后的需要进行标记,不能再移动), 就可以在最后完成移动。
    所以需要a[n]来存储数组,b[(m+i)%n]=1来确定是否这个下标的a[(m+i)%n]已经移动过!!

*问题

  1. 本题中要求最后不能有空格!!所以需要将最后一个特殊处理
#include <iostream>
using namespace std;

int main() {
	int a[101];
	int b[101] = {0};
	int i, j = 0, n, m, temp;
	cin>>n>>m;
	for(i=0; i<n; i++) {
		cin>>a[i];
	}  
	for(i=0; i<n; i++) {
		if(b[i] == 0) {
			temp = a[i];
			a[i] = a[(i+m)%n];
			a[(i+m)%n] = temp;
			b[(i+m)%n] = 1;
		}
	}
	for(i=0; i<n; i++) {
		if(i != n-1) {
			cout<<a[i]<< " ";
		}else {
			cout<<a[i];
		}
		
	}
	return 0;

} 

方法二:(网上的做法,很精彩)

  • 核心思想
  1. 主题思想是,在输入的时候就按照移动过后的进行输入。所以输入 = 移动
  2. 同时他也相当于从i=0开始进行的,因为m = (i+m) % n === m = (m++)%n
    循环n次,也就将各个值放入了a【n】中

#include <stdio.h>
 
int main()
{
	int n,m;
	scanf("%d %d",&n,&m);
	if(n<=100&&n>=1){ 
		int temp[n];
		for(int i=0;i<n;i++){
			m=m%n;
			scanf("%d",&temp[m]);
			m++;
		}
		int count=1;
		for(int i=0;i<n;i++){
			printf("%d",temp[i]);
			if(count<n){ 
				printf(" ");
				count++;
			} 
		}
	}
	return 0; 
}

最后

以上就是温暖冬日为你收集整理的PAT乙类1008之数组元素循环右移问题一、题目二、代码的全部内容,希望文章能够帮你解决PAT乙类1008之数组元素循环右移问题一、题目二、代码所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(53)

评论列表共有 0 条评论

立即
投稿
返回
顶部