解题思路
通过模拟填数过程来构造队列:
- 从1开始依次填入数字
- 每次填数时跳过两个空位置
- 如果到达末尾则回到开头继续
- 直到所有数字都填入
关键点
- 循环查找空位置
- 处理数组边界
- 按顺序填入数字
代码
#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()
算法及复杂度
- 算法:模拟填数
- 时间复杂度:
,每个数字需要查找空位置
- 空间复杂度:
,存储结果数组