解题思路

通过模拟填数过程来构造队列:

  1. 从1开始依次填入数字
  2. 每次填数时跳过两个空位置
  3. 如果到达末尾则回到开头继续
  4. 直到所有数字都填入

关键点

  1. 循环查找空位置
  2. 处理数组边界
  3. 按顺序填入数字

代码

#include <iostream>
#include <vector>
using namespace std;

class QueueConstructor {
private:
    // 查找下一个空位置
    int findNextEmpty(const vector<int>& arr, int start) {
        int n = arr.size();
        int pos = start;
        while (arr[pos] != 0) {
            pos = (pos + 1) % n;
        }
        return pos;
    }

public:
    vector<int> constructQueue(int n) {
        vector<int> result(n);
        int currentPos = 0;
        
        // 依次填入1到n的数字
        for (int num = 1; num <= n; num++) {
            // 找到第一个空位后的位置
            currentPos = findNextEmpty(result, currentPos);
            currentPos = (currentPos + 1) % n;
            
            // 找到第二个空位
            currentPos = findNextEmpty(result, currentPos);
            
            // 填入数字
            result[currentPos] = num;
        }
        
        return result;
    }
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    
    int T;
    cin >> T;
    
    QueueConstructor solver;
    while (T--) {
        int n;
        cin >> n;
        
        vector<int> result = solver.constructQueue(n);
        
        // 输出结果
        for (int i = 0; i < n; i++) {
            cout << result[i];
            if (i < n - 1) cout << " ";
        }
        cout << "\n";
    }
    
    return 0;
}
import java.util.*;

public class Main {
    static class QueueConstructor {
        public List<Integer> constructQueue(int n) {
            List<Integer> result = new ArrayList<>(Collections.nCopies(n, 0));
            int currentPos = 0;
            
            // 依次填入1到n的数字
            for (int num = 1; num <= n; num++) {
                // 找到第一个空位后的位置
                currentPos = findNextEmpty(result, currentPos);
                currentPos = (currentPos + 1) % n;
                
                // 找到第二个空位
                currentPos = findNextEmpty(result, currentPos);
                
                // 填入数字
                result.set(currentPos, num);
            }
            
            return result;
        }
        
        private int findNextEmpty(List<Integer> arr, int start) {
            int pos = start;
            while (arr.get(pos) != 0) {
                pos = (pos + 1) % arr.size();
            }
            return pos;
        }
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int T = sc.nextInt();
        
        QueueConstructor solver = new QueueConstructor();
        StringBuilder output = new StringBuilder();
        
        while (T-- > 0) {
            int n = sc.nextInt();
            List<Integer> result = solver.constructQueue(n);
            
            // 构建输出字符串
            for (int i = 0; i < n; i++) {
                output.append(result.get(i));
                if (i < n - 1) output.append(" ");
            }
            output.append("\n");
        }
        
        System.out.print(output);
        sc.close();
    }
}
def solve(n: int) -> list:
    # 初始化结果数组
    result = [0] * n
    current_pos = 0
    
    # 填入1到n的数字
    for num in range(1, n + 1):
        # 跳过第一个空位
        while result[current_pos] != 0:
            current_pos = (current_pos + 1) % n
            
        current_pos = (current_pos + 1) % n
        
        # 跳过第二个空位
        while result[current_pos] != 0:
            current_pos = (current_pos + 1) % n
            
        # 填入当前数字
        result[current_pos] = num
    
    return result

def main():
    # 读取测试用例数量
    T = int(input())
    
    for _ in range(T):
        n = int(input())
        ans = solve(n)
        print(*ans)  # 使用解包操作输出,自动处理空格

if __name__ == "__main__":
    main()

算法及复杂度

  • 算法:模拟填数
  • 时间复杂度:,每个数字需要查找空位置
  • 空间复杂度:,存储结果数组