问题描述
根据输入的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√