1 条题解
-
0
在这个问题中,你可以实现一个与题目描述过程相反的算法。让我们维护两个指针,分别指向最左边和最右边尚未处理的元素。然后,通过以下方式恢复原始数组:
- 将最左边未处理的元素放在第一个位置
- 将最右边未处理的元素放在第二个位置
- 将最左边未处理的元素放在第三个位置
- 将最右边未处理的元素放在第四个位置
- ……
也就是说,一般情况下,你将最左边的元素放在所有奇数位置上,将最右边的元素放在所有偶数位置上。每处理一个元素后,你要么将左指针向前移动一位,要么将右指针向后移动一位。
#include <bits/stdc++.h> using namespace std; void solve() { int n; cin >> n; vector<int> v(n); for (int &e : v) { cin >> e; } int left = 0, right = n - 1; vector<int> ans(n); for (int i = 0; i < n; i++) { if (i % 2 == 0) { ans[i] = v[left++]; } else { ans[i] = v[right--]; } } for (int i : ans) { cout << i << " "; } cout << "\n"; } int main() { int t; cin >> t; while (t--) { solve(); } }
- 1
信息
- ID
- 6791
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 5
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者