某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
Input本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
Output共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
Sample Input
2 20 40
Sample Output
1 7 19 1 19 37
思路:循环队列
代码:
import java.util.ArrayDeque; import java.util.Scanner; public class Main{ static void operate(int num){ ArrayDeque<Integer> q=new ArrayDeque<>(); for(int i=1;i<=num;i++) q.offer(i); while(true){ if(q.size()<=3) break; q.offer(1); q.poll(); for(int i=2;q.peek()!=1;i++){ if(i%2>0) {//一定是大于0,开始写成不等于1,我想存放的是下标不能被2整除的数 int t=q.peek(); q.offer(t); } q.poll(); } if(q.size()<=3) break; q.offer(1); q.poll(); for(int i=2;q.peek()!=1;i++){ if(i%3>0) {//一定大于0,开始写成不等于1,我想存放的是下标不能被3整除的数 int t=q.peek(); q.offer(t); } q.poll(); } } while(!q.isEmpty()){ System.out.print(q.poll()); if(q.size()!=0) System.out.print(" ");//注意是不等于0,而不是1 } System.out.println(); } public static void main(String[] args) { Scanner scan=new Scanner(System.in); while(scan.hasNext()){ int n=scan.nextInt(); while(n-->0){ int num=scan.nextInt(); operate(num); } } } }