Java开发网 Java开发网
注册 | 登录 | 帮助 | 搜索 | 排行榜 | 发帖统计  

您没有登录

» Java开发网 » Java SE 综合讨论区  

按打印兼容模式打印这个话题 打印话题    把这个话题寄给朋友 寄给朋友    该主题的所有更新都将Email到你的邮箱 订阅主题
flat modethreaded modego to previous topicgo to next topicgo to back
作者 Re:一个csdn上面的一道小题 [Re:stream]
billgacsli





发贴: 11
积分: 0
于 2008-06-20 13:23 user profilesend a private message to usersearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
我也分享下我的算法。

法一:通过数组实现,伪删除

  /**
   * N个人围成一圈依次从1报数,报到rem的人出局,下一个人重新从1开始报数,直至剩下一个人。
   *
   * @param N 总人数
   * @param rem 数到rem的人出局(注:从1开始数)
   * @param printable 标示是否打印中间过程
   * @return
   */
  public static int getBestPosition2(int N, int rem, boolean printable){
    int positions[] = new int[N];
    for(int i = 0; i < N; i++){
      positions[i] = i + 1;
    }
    int bestNumber = 1;
    int count = 0;
    while(true){
      for(int i = 0; i < N; i++){
        if(positions[i] != 0){//跳过标记为0的数
          count++;
        }
        if(count == rem){
          positions[i] = 0; //出局的数设定为0作标记
          count = 0;
          if(printable){
            print(i, positions);
          }
        }
      }
      if(count == 1){
        for (int i = 0; i < N; i++){ // 从结果中取出最好的数
          if(positions[i] != 0){
            bestNumber = positions[i];
          }
        }
        break;
      }
    }
    return bestNumber;
  }


法二:通过List实现,真删除(ps:这个费了好多劲,下标计算老是不对)

  public static int getBestPosition(int N, int rem, boolean printable){
    List<Integer> positions = new ArrayList<Integer>();
    for(int i = 0; i < N; i++){
      positions.add(i+1);
    }

    int toRemove = (rem - 1) % N; //下标从0开始
    positions.remove(toRemove);
    if(printable){
      print(toRemove, positions);
    }
    int removed = 1;
    while(removed < N - 1){
      toRemove += rem - 1;//继续数数,减1是因为数据减少了一个
      toRemove %= positions.size();//进行规整
      positions.remove(toRemove);
      removed++;
      if(printable){
        print(toRemove, positions);
      }
    }
    return positions.get(0);
  }



  public static void print(int toRemove, int[] nums) {
    System.out.print((toRemove+1)+" : ");
    for (int i = 0; i < nums.length; i++){
      if(nums[i] == 0)continue;
      System.out.print(nums[i]);
    }
    System.out.println();
  }

  public static void print(int toRemove, List<Integer> list) {
    System.out.print((toRemove+1)+" : ");
    for (int pos : list){
      if(pos == 0)continue;
      System.out.print(pos);
    }
    System.out.println();
  }




关于 异常 。。。。 谢谢指教

话题树型展开
人气 标题 作者 字数 发贴时间
17853 一个csdn上面的一道小题 stream 46 2007-10-19 12:34
12736 Re:一个csdn上面的一道小题 wmfsczx 9 2008-01-27 11:56
11519 Re:一个csdn上面的一道小题 jancyu2008 1483 2008-06-28 00:24
11322 Re:一个csdn上面的一道小题 54powerman 21 2008-07-04 23:45
11339 Re:一个csdn上面的一道小题 rbible 21 2008-07-06 16:52
10831 Re:一个csdn上面的一道小题 danielchirs 4 2008-08-22 23:21
13049 Re:一个csdn上面的一道小题 wmfsczx 9 2008-01-27 12:08
12490 Re:一个csdn上面的一道小题 lupingui 104 2008-03-27 18:32
11976 Re:一个csdn上面的一道小题 istimeto 850 2008-06-17 00:17
11872 Re:一个csdn上面的一道小题 istimeto 26 2008-06-17 00:19
11381 Re:一个csdn上面的一道小题 climby 1601 2008-06-18 16:51
11349 Re:一个csdn上面的一道小题 andy_wang_5 0 2008-06-19 10:34
11532 Re:一个csdn上面的一道小题 billgacsli 41 2008-06-20 11:07
11492 Re:一个csdn上面的一道小题 billgacsli 1988 2008-06-20 13:23

flat modethreaded modego to previous topicgo to next topicgo to back
  已读帖子
  新的帖子
  被删除的帖子
Jump to the top of page

   Powered by Jute Powerful Forum® Version Jute 1.5.6 Ent
Copyright © 2002-2021 Cjsdn Team. All Righits Reserved. 闽ICP备05005120号-1
客服电话 18559299278    客服信箱 714923@qq.com    客服QQ 714923