题目如下:
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。 本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。 共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。 Sample Input
2
20
40Sample Output
1 7 19
1 19 37我刚学这个不久,对于这个题目感觉很烦恼啊,求高手告诉我该如何做,最好赋予代码

解决方案 »

  1.   

    就是一个简单的循环移动数组吧 public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    int count = scanner.nextInt();
    List<Integer> inputs = new ArrayList<Integer>(count);
    for(int i = 0; i < count; i++)
    inputs.add(scanner.nextInt());

    for(Integer num : inputs) {
    int remain = num;
    int[] soldiers = new int[remain];
    for(int i = 0; i < remain; i++)
    soldiers[i] = i + 1;
    while(remain > 3) {
    remain -= removeSoldiers(soldiers, 2, remain);
    if(remain <= 3)
    break;
    remain -= removeSoldiers(soldiers, 3, remain);
    }
    for(int i = 0; i < remain; i++)
    System.out.print(soldiers[i] + "\t");
    System.out.println();
    }

    } private static int removeSoldiers(int[] soldiers, int count, int remain) {
    int left = count - 1;
    int right = count - 1;
    int removed = 0;
    while(right < remain) {
    for(int i = 0; i < count - 1 && right + 1 + i < remain; i++)
    soldiers[left + i] = soldiers[right + 1 + i];
    left += count - 1;
    right += count;
    removed++;
    }
    return removed;
    }
      

  2.   

    public class SoliderSort {
    public static void main(String[] args) {
    final int NUM = 100;      //NUM代表士兵的个数
    int[] a = new int[NUM];   
    for (int i = 0; i < NUM; i++) {  //初始化士兵数组
    a[i] = i + 1;
    }
    int temp = NUM;                  //temp存储当前剩余士兵的人数
    int i = 0;
    int j = 0;
    int k = 0;
    while (temp > 3) {               //剩余士兵数大于3个时按照规则进行
    for (i = 0, j = 0; i < temp; i = i + 2, j++) {    //按照数1,2的规则,将数1的士兵保存下来
    a[j] = a[i]; }
    temp = j;         //剩余士兵的个数
    for (k = 0; k < temp; k++) {   //输出本轮剩余士兵的编号
    System.out.print(a[k] + "  ");
    }
    System.out.println();
    if (temp < 4) {       //当剩余的士兵数小于4个时  输出剩余的士兵编号 并且退出
    for (k = 0; k < temp; k++) {
    System.out.println(a[k]);
    }
    break;
    }
    for (i = 0, j = 0; i < temp; i = i + 3, j++) {//按照数1,2,3的规则,将数1的士兵保存下来
    a[j] = a[i]; }
    temp = j;           //剩余士兵的个数
    for (k = 0; k < temp; k++) {    //输出本轮剩余士兵的编号
    System.out.print(a[k] + "  ");
    }
    System.out.println();
    if (temp < 4) {     //当剩余的士兵数小于4个时  输出剩余的士兵编号 并且退出
    System.out.print("最终结果为:" + '\n');
    for (k = 0; k < temp; k++) {
    System.out.print(a[k] + "  ");
    }
    break;
    }
    }
    }
    }
    没有按照楼主的规则写,但是稍微改造一下即可~~~
      

  3.   

    public class SoliderSort {
    public static void main(String[] args) {
    final int NUM = 100;      //NUM代表士兵的个数
    int[] a = new int[NUM];   
    for (int i = 0; i < NUM; i++) {  //初始化士兵数组
    a[i] = i + 1;
    }
    int temp = NUM;                  //temp存储当前剩余士兵的人数
    int i = 0;
    int j = 0;
    int k = 0;
    while (temp > 3) {               //剩余士兵数大于3个时按照规则进行
    for (i = 0, j = 0; i < temp; i = i + 2, j++) {    //按照数1,2的规则,将数1的士兵保存下来
    a[j] = a[i]; }
    temp = j;         //剩余士兵的个数
    for (k = 0; k < temp; k++) {   //输出本轮剩余士兵的编号
    System.out.print(a[k] + "  ");
    }
    System.out.println();
    if (temp < 4) {       //当剩余的士兵数小于4个时  输出剩余的士兵编号 并且退出
    for (k = 0; k < temp; k++) {
    System.out.print(a[k]+"  ");
    }
    break;
    }
    for (i = 0, j = 0; i < temp; i = i + 3, j++) {//按照数1,2,3的规则,将数1的士兵保存下来
    a[j] = a[i]; }
    temp = j;           //剩余士兵的个数
    for (k = 0; k < temp; k++) {    //输出本轮剩余士兵的编号
    System.out.print(a[k] + "  ");
    }
    System.out.println();
    if (temp < 4) {     //当剩余的士兵数小于4个时  输出剩余的士兵编号 并且退出
    System.out.print("最终结果为:" + '\n');
    for (k = 0; k < temp; k++) {
    System.out.print(a[k] + "  ");
    }
    break;
    }
    }
    }
    }
      

  4.   

     完全正解,不过对于你的代码,我好多都是还没看到的知识,呵呵,先看懂先。
    那个List<Integer> ....是泛化么? 这样有什么好处额。也谢谢4楼的,你的算法对于现在的我刚好看得懂,我修改下应该能用
      

  5.   

    for(Integer num : inputs) 问下 这句话是什么意思 怎么判断循环条件的