PTA刷题Basic篇——1008.数组元素循环右移问题——Day(4)

问题描述

在这里插入图片描述根据输入的M将数组进行翻转,即从倒数第M个数组开始,将这一段加入到数组的最前面,且这一段顺序保持不变。

题目分析

题目要求我们不能创建一个新的数组,且要求移动次数尽量少。由于这是一个将尾和头联系起来的问题,我们可以想到利用双向链表解题,需要引入容器。关于C++的list容器,可以参考这篇博客
然后我们通过迭代器访问整个双向链表来取出每一个元素。

list<int>::iterator i;

代码

#include <iostream>
#include <list>
using namespace std;
int main()
{
    //元素个数
    int M;
    //移动位数
    int N;
    cin>>M>>N;
    //保证N一定小于M
    N = N % M;
    list<int>l;
    int number;//输入数字
    for(int i = 0;i < M;i++)
    {
        cin>>number;
        l.push_back(number);
    }
    list<int> ::iterator i;
    if(N > M / 2)
    {
        for(int i = 0;i < M - N;i++)
        {
            int element = l.front();
            l.pop_front();
            l.push_back(element);
        }
    }
    else
    {
        for(int i = 0;i < N;i++)
        {
            int element = l.back();
            l.pop_back();
            l.push_front(element);
        }
    }
    //遍历双向链表中的元素使用的方法是利用迭代器,所以要先声明一个迭代器
    //并且不断向后访问的过程只是迭代器不断自增的过程
    //但每个位置我们只是得到了元素的引用,如果要得到这个元素值需要用*
    list<int> :: iterator k,kend;
    kend = l.end();
    for(k = l.begin();k != kend;k++)
    {
        cout<<*k;
        if(*k != l.back())
            cout<<" ";
    }
    return 0;
}

总结

答题用时15min
Q8——finish√

发布了60 篇原创文章 · 获赞 2 · 访问量 1073

猜你喜欢

转载自blog.csdn.net/weixin_44755413/article/details/105452840