1 条题解

  • 0
    @ 2026-5-4 14:50:29

    在这个问题中,你可以实现一个与题目描述过程相反的算法。让我们维护两个指针,分别指向最左边最右边尚未处理的元素。然后,通过以下方式恢复原始数组:

    • 将最左边未处理的元素放在第一个位置
    • 将最右边未处理的元素放在第二个位置
    • 将最左边未处理的元素放在第三个位置
    • 将最右边未处理的元素放在第四个位置
    • ……

    也就是说,一般情况下,你将最左边的元素放在所有奇数位置上,将最右边的元素放在所有偶数位置上。每处理一个元素后,你要么将左指针向前移动一位,要么将右指针向后移动一位。

    #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
    上传者