牛客真题,输入一个长度为n的序列,对序列的每一次操作分两步,第一步将当前位元素放入新容器的末尾,第二步对新容器的序列进行反转,这两步操作执行n次,求新的容器序列的输出结果。
分析:
1、可以使用容器存放序列,然后每加入一次,就进行反转一次,知道n次,但是这样会超时;
2、其实可以找到规律,发现每次输出的数是大小相隔2的,那么就可以利用这个特性直接输出,不用反转序列,最后的结果没有超时。
附上C++超时代码1:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n;
cin>>n;
int a[n];
for(int i=0;i<n;i++)
cin>>a[i];
vector<int> t;
for(int i=0;i<n;i++)
{
t.push_back(a[i]);
for(int k=0;k<t.size()/2;k++)
{
int tmp=t[k];
t[k]=t[t.size()-k-1];
t[t.size()-k-1]=tmp;
}
}
for(int j=0;j<t.size();j++)
cout<<t[j]<<" ";
}
附上通过C++代码:
#include<iostream>
#include<vector>
using namespace std;
int main()
{
int n;
cin>>n;
int a[n];
for(int i=0;i<n;i++)
cin>>a[i];
int j=n-1;
for(;j>=0;j--,j--)
cout<<a[j]<<" ";
int k;
if(n%2==0)
k=1;
else
k=3;
for(j=j+k;j<n;j++,j++)
cout<<a[j]<<" ";
}
附上python代码:
n=int(input())
a=input().split()
t=[]
if n%2==0:
t.extend(a[1::2][::-1])
t.extend(a[::2])
else:
t.extend(a[::2][::-1])
t.extend(a[1::2])
print(' '.join(t))