问题:100张多米诺骨牌整齐的排成一列,依顺序编号1.2.3.——99.100。第一次拿走所有奇数位置的骨牌,第二次再从剩余的骨牌中拿走所有奇数位置上的骨牌。依此类推。问最后剩下的一张骨牌的编号是多少?下面是我写的 有错 请问怎么改 谢谢import java.util.*;
public class Test{

ArrayList bl=new ArrayList();
public ArrayList a(ArrayList al){
bl.clear();
for(int i=1;i<=al.size();i=i+2){
           bl.add(al.get(i));          
       }
       System.out.println(bl.get(0));
       return a(bl);
      
    }

   public static void main(String []args){      
      ArrayList cl=new ArrayList();
      for(int i=1;i<=100;i++){
       cl.add(i);
      }
      Test t=new Test();
      
      t.a(cl);
      System.out.println(t.bl.get(0));
   }
}

解决方案 »

  1.   

    这个问题有人提过 
    可能会对你有帮助:
    http://community.csdn.net/Expert/topic/4157/4157909.xml?temp=.2725946
      

  2.   

    我觉得:
    第一,Text类中的BL和AL指向同一个ArrayList对象,所以,当你clear()的时候,AL也clear了,所以就有一个越界的异常....第二,楼主想用递归,可是递归最普通的格式就是IF(return X)else(return N),也就是说必须有一个递归结束的标志....
      

  3.   

    我改动了下 还是有问题 谢谢 赐教
    import java.util.*;
    public class Test{

    ArrayList bl=new ArrayList();
    public ArrayList a(ArrayList al){
    bl.clear();
    if(al.size()>1){
    for(int i=1;i<=al.size();i=i+2){
                bl.add(al.remove(i));          
           }
           System.out.println(bl.get(0));
           return a(bl);
           }
           else return al;      
        }

       public static void main(String []args){      
          ArrayList cl=new ArrayList();
          for(int i=1;i<=100;i++){
           cl.add(i);
          }
          Test t=new Test();      
          t.a(cl);
          System.out.println(t.bl.get(0));
       }
    }
      

  4.   

    这样吧,你看我的代码:
    ---------------------------------------/*问题可以理解为:
     * 假设原来有一个盒子A,里面有一些各种颜色的珠子,要把盒子中的满足某条件的珠子挑出来
     * 用ArrayList是很好的,因为ArrayList.add(Object a);就非常的形象...
     *这个问题思路为
     *
     *必须有两个盒子,一个是原来的盒子A ,一个是暂时存放挑出的物品的盒子B
     *
     *那么步骤为:
     *1.在原来的盒子A中把满足条件的珠子挑出来,放到暂存盒子B中
     *2.挑完之后,把原来的盒子A的其他珠子丢掉(清空)
     *3.再把暂存盒子B中的物品倒入原来的盒子A
     *4.判断,如果现在盒子A中的珠子没有满足最终条件,则重复步骤1
     * 如果盒子A中的珠子满足了条件,那么这个盒子就是所需要的盒子(返回)
     *
     * */import java.util.*;
    public class choosebox
    {


    public static ArrayList choose(ArrayList first)
    {
    //temp即为暂时存放的盒子B
    ArrayList temp=new ArrayList();

    //把first中所需要的挑出来放到盒子B中
    System.out.println("挑出来的是:");
    for(int i=1;i<=first.size();i=i+2)
    {
               temp.add(first.get(i-1)); 
               System.out.println(" "+first.get(i-1));
           }

    //挑完了,把first清空
    first.clear();

    //再把盒子B中的倒回first中
    for(int i=1;i<=temp.size();i++)
    {
    first.add(temp.get(i-1)); 
               //System.out.println(temp.get(i-1));
           }

    //判断,
    if(first.size()==1)
    {
    //如果挑到剩下一个,则返回
    return first;
    }
    else
    {
    //如果不是,则继续挑....
               return choose(first);
    }
        }

       public static void main(String []args)
       {  
      ArrayList mybox=new ArrayList();
      for(int i=1;i<=100;i++)
      {
           mybox.add(i);
      }
          choosebox.choose(mybox);
          System.out.println("最后结果是:"+mybox.get(0));
       }
    }
      

  5.   

    楼主还有一个错误
    就是在FOR循环里面
    应该是for(int i=1;i<al.size();i=i+2)
    而不是for(int i=1;i<=al.size();i=i+2)----------------------------------------------
    我上面的代码错了,应该是:
    import java.util.*;
    public class choosebox
    {


    public static ArrayList choose(ArrayList first)
    {
    //temp即为暂时存放的盒子B
    ArrayList temp=new ArrayList();

    //把first中所需要的挑出来放到盒子B中
    System.out.println("挑出来的是:");
    for(int i=1;i<first.size();i=i+2)
    {
               temp.add(first.get(i)); 
               System.out.println(" "+first.get(i));
           }

    //挑完了,把first清空
    first.clear();

    //再把盒子B中的倒回first中
    System.out.println("倒回去的是:");
    for(int i=1;i<temp.size();i++)
    {
    first.add(temp.get(i)); 
               System.out.println(temp.get(i));
           }

    //判断,
    if(first.size()==1)
    {
    //如果挑到剩下一个,则返回
    return first;
    }
    else
    {
    //如果不是,则继续挑....
               return choose(first);
    }
        }

       public static void main(String []args)
       {  
      ArrayList mybox=new ArrayList();
      for(int i=1;i<=100;i++)
      {
           mybox.add(i);
      }
          choosebox.choose(mybox);
          System.out.println("最后结果是:"+mybox.get(0));
       }
    }
      

  6.   

    呵呵,我也练练手哈:public class Dominos {
      private static final int[] numbers = new int[100];
      public static int left = -1;
      static {
        for(int i = 0; i < 100; i++)
        numbers[i] = i+1;
      }
      private static void pick(int[] lefts) {
        int[] temp = new int[lefts.length/2];
        for(int i = 0, j = 1; i < temp.length; i++, j+=2) {
        temp[i] = lefts[j];
        }
        if(temp.length < 2) {
          left = temp[0];
          return;
        }
        /*
        for(int i = 0; i < temp.length; i++)
          System.out.print(temp[i] + " ");
        System.out.println();
        */
        pick(temp);
      }
      public static void main(String[] args) {
        pick(numbers);
        System.out.println(left + " is left.");
      }
    }最后剩下:64。去掉中间那段注释可以看到每一次拿掉以后的结果。
      

  7.   

    我也来凑个热闹:
    public static void main(String[] args) {
    List list = new ArrayList();
    for(int i=0; i<100;i++){
    list.add(i+1+"");
    }
    while(list.size()>1){
    for(int i=0; i<list.size();i++){
    list.remove(i);
    }
    }
    Conica.pl("The last is:"+list.get(0));
    }
      

  8.   

    import java.util.*;public class removeDemo 
    {
    public static ArrayList removebox(ArrayList temp)
    {
    System.out.println("移除的是:");
    for(int i=0;i<temp.size();i++)
    {
    System.out.println(temp.get(i));
    temp.remove(i);
    }
    if(temp.size()>1)
    {
    return removebox(temp);
    }
    else 
    {
    return temp;
    }
    }
    public static void main(String[] agrs)
    {
    ArrayList mytext=new ArrayList();
    for(int i=1;i<=100;i++)
    {
    mytext.add(i);
    }
    removeDemo.removebox(mytext);
    System.out.println("最后结果是:"+mytext.get(0));
    }}
      

  9.   

    TONYBLARED(奔放的犀牛) while(list.size()>1){
    for(int i=0; i<list.size();i++){
    list.remove(i);
    怎么理解啊
      

  10.   

    每除掉一个数,List的size就会变化。下一个偶数,就变成直接下一个了。
    自己试试看。
      

  11.   

    package test;
    import java.util.*;
    /**
     * TODO 功能描述
     * 
     * @author cqs
     * @version $Revision$ 
     * @date 2006-3-18 14:14:49
     */
    public class Test {    /**
         * 
         */
        public Test() {
            super();
            // TODO Auto-generated constructor stub
        }    public static void main(String[] args) {
            List list = new ArrayList();
            for(int i=0; i<100;i++){
            list.add(i+1+"");
            }
            while(list.size()>1){
            for(int i=0; i<list.size();i++){
            list.remove(i);
            }
            }
           System.out.println("The last is:"+list.get(0));
            }}
    楼上的完全可以,思路很妙
      

  12.   

    大家有没有考虑效率问题啊?要知道ArrayList从中间删除元素时花销是很大的。
      

  13.   

    代码效率与简洁是程序的双刃剑,必有牺牲一个。通过部分比较得出以下结果。
    Dan1980(不用IDE的大傻瓜) ( ) 信誉:98  2006-3-18 2:35:15  得分: 0 
    /*
     * Created on 2006-3-18
     * 
     * TODO To change the template for this generated file go to Window -
     * Preferences - Java - Code Style - Code Templates
     */
    package com.pss.test2;import com.pss.util.prints.Conica;public class Dominos {
    private static final int[] numbers = new int[100]; public static int left = -1;
    static {
    for (int i = 0; i < 100; i++)
    numbers[i] = i + 1;
    } private static void pick(int[] lefts) {
    int[] temp = new int[lefts.length / 2];
    for (int i = 0, j = 1; i < temp.length; i++, j += 2) {
    temp[i] = lefts[j];
    }
    if (temp.length < 2) {
    left = temp[0];
    return;
    }
    /*
     * for(int i = 0; i < temp.length; i++) System.out.print(temp[i] + " ");
     * System.out.println();
     */
    pick(temp);
    } public static void main(String[] args) {
    long start = System.currentTimeMillis();
    int count = 0;
    while (count < 100000) {
    pick(numbers);
    System.out.println(left + " is left.");
    count++;
    }
    long end = System.currentTimeMillis();
    Conica.pl("It cost " + (end - start) + "ms");
    }
    // when count=1,cost 0
    // when count=10,cost 0
    // when count=100,cost 47
    // when count=1000,cost 172
    // when count=10000,cost 547
    // when count=100000,cost 5187
    //  以上单位毫秒
    }
     TONYBLARED(奔放的犀牛) ( ) 信誉:95  2006-3-18 3:34:46  得分: 0  public void fun01() {
    List list = new ArrayList();
    for (int i = 0; i < 100; i++) {
    list.add(i + 1 + "");
    }
    long start = System.currentTimeMillis();
    int count = 0;
    while (count < 100000) {
    while (list.size() > 1) {
    for (int i = 0; i < list.size(); i++) {
    list.remove(i);
    }
    }
    Conica.pl("The last is:" + list.get(0));
    count++;
    }
    long end = System.currentTimeMillis();
    Conica.pl("It cost " + (end - start) + "ms");
    // when count=1,cost 0
    // when count=10,cost 0
    // when count=100,cost 47
    // when count=1000,cost 172
    // when count=10000,cost 687
    // when count=100000,cost 5250
    //   以上单位毫秒
    }大家可以看到,耗费的时间相差很少。我的程序相当棒。liang8305(七分之雨后) ( ) 信誉:100  2006-03-18 09:57:00  得分: 0  
    此程序通不过。其他的没去一一比较,有空者可以从效率的角度去比较。
      

  14.   

    楼上的,服了你了,ArrayList的效率不是这样测的。都用100个数来测当然效率差别不大,但要是计算1000000个数呢?用我的程序:public class Dominos2 {
    private static final int[] numbers = new int[1000000];
    public static int left = -1;
    static {
    for(int i = 0; i < numbers.length; i++)
    numbers[i] = i+1;
    }
    private static void pick(int[] lefts) {
    int[] temp = new int[lefts.length/2];
    for(int i = 0, j = 1; i < temp.length; i++, j+=2)
    temp[i] = lefts[j];
    if(temp.length < 2) {
    left = temp[0];
    return;
    }
    pick(temp);
    }
    public static void main(String[] args) {
    long start = System.currentTimeMillis();
    pick(numbers);
    long end = System.currentTimeMillis();
    System.out.println(left + " is left.");
    System.out.println("Cost " + (end - start) + " ms. ");
    }
    }输出:524288 is left.
    Cost 31 ms. -------------------------------------------------------------------而用你的(稍作修改以通过编译):import java.util.*;
    public class Dominos3 {
    public static void fun01() {
    List list = new ArrayList();
    for (int i = 0; i < 1000000; i++)
    list.add(i + 1 + "");

    long start = System.currentTimeMillis();
    while (list.size() > 1)
    for (int i = 0; i < list.size(); i++)
    list.remove(i);
    System.out.println("The last is:" + list.get(0));
    long end = System.currentTimeMillis();
    System.out.println("It cost " + (end - start) + "ms");
    }
    public static void main(String[] args) {
    fun01();
    }
    }在我的电脑上一分钟了还没结果,我只好换成100000再测,结果输出:The last is:65536
    It cost 4688ms效率不言自明。
      

  15.   

    我的程序换成100000测的时候,输出:65536 is left.
    Cost 0 ms. 
      

  16.   

    呵呵,领教。
    Dan1980(不用IDE的大傻瓜) 强!有机会多交流哈。
      

  17.   

    for(int i=1;i<=al.size();i=i+2){
              bl.add(al.get(i));         
          }不应该用for  循环遍厉数组,应该用ArrayList里面自己带的hasnext和next方法
      

  18.   

    private static void OutputArray(int [] array,int count){
    for(int i = 0;i < array.length;++i)
    if(array[i] != -1)
    System.out.print(array[i] + " ");
    System.out.println("count = " + count);
    }
    private static void Test08() {
    final int range = 100;
    int[] data = new int[range];
    for (int i = 0; i < range; ++i)
    data[i] = i + 1;
    final int selector = 2; //you can change
    int count;
    do {
    count = 0;
    for (int i = 0; i < range; ++i) {
    if (data[i] != -1) {
    if (count % selector == 0)
    data[i] = -1;
    ++count;
    }
    }
    count = count * (selector - 1) / selector;
    OutputArray(data, count);
    } while (count > 1);
    }result:64
      

  19.   

    我也写了一个,大家侃侃import java.util.*;public class TestAA 
    {

    private static void removeJS (List records)
    {
    for(int i=records.size()-1;i>=0;i-=2)
    {
    records.remove(i);
    }
    }

    public static void main(String[] args)
    {
    int n=100;
    List records = new ArrayList();
    for(int i=0;i<n;i++)
    {
    records.add(""+(n-i));
    }

    do
    {
    removeJS(records);
    System.out.println(records);
    }while(records.size()>1);

    System.out.println("last num is :"+records.get(0));
    }}
      

  20.   

    public class Test {
    public static void main(String[] args)
    {
    int i=1;
    while(i<100)
    i *= 2;
    System.out.println(i/2);
    }
    }
      

  21.   

    第一题中
    String s1 = “aaa”;
    String s2 = “aaa”;
    这2句不是建立2个引用s1和s2,分别指向2个字符串对象吗
    我看到书上说java中所有的对象都是建立在堆区的,分别建立这2个对象在内存中的地址不是就不一样了吗
    而s1==s2不是比较他们的引用吗,这不是和c++中的比较地址差不多吗,怎么结果会为true呢因为刚刚学java,很多原理还不明白,望高人指点一下啊、