zoukankan      html  css  js  c++  java
  • PAT 乙级 1008 数组元素循环右移问题 (20) C++版

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

    时间限制
    400 ms
    内存限制
    65536 kB
    代码长度限制
    8000 B
    判题程序
    Standard

    一个数组A中存有N(N>0)个整数,在不允许使用另外数组的前提下,将每个整数循环向右移M(M>=0)个位置,即将A中的数据由(A0A1……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


    思路:该题最简单的做法就是使用链表,大家可以试试,O(1)时间完成,本文采用一种三次逆置算法来实现,大家注意逆置区间,思路还还是比较清晰,现将左区间逆置,再将右区间逆置,再将整体区间逆置,即可得到结果

    注意点:
    1.要考虑M大于N的情况
    2.逆置区间的选定

     1 // 1008_1.cpp : 定义控制台应用程序的入口点。
     2 //
     3 
     4 #include "stdafx.h"
     5 #include<iostream>
     6 #include<list>
     7 #include<algorithm>
     8 
     9 using namespace std;
    10 
    11 int main()
    12 {
    13     int N, M,t;
    14 
    15     cin >> N >> M;
    16 
    17     int *p = new int[N];
    18 
    19     for (int i = 0; i < N; i++)
    20         cin >> p[i];
    21 
    22     M = M%N;//防止M大于N的情况出现,导致地址访问出错
    23 
    24     //算法关键
    25     reverse(p, p +N- M);
    26     reverse(p + N - M, p + N);
    27     reverse(p, p + N);
    28 
    29     for (int i = 0; i < N; i++)
    30     {
    31         if (i == 0)
    32             cout << p[0];
    33         else
    34             cout << " " << p[i];
    35     }
    36 
    37     delete[] p;
    38 
    39     return 0;
    40 }
  • 相关阅读:
    家庭记账本开发进度6
    家庭记账本开发进度5
    家庭记账本开发进度4
    家庭记账本开发笔记3
    大道至简阅读笔记01
    个人作业 数组(续)
    二维数组
    个人作业1-数组
    软件工程第一周开课微博
    第一周学习进度条报告
  • 原文地址:https://www.cnblogs.com/cdp1591652208/p/7161684.html
Copyright © 2011-2022 走看看