feezh

          我們之所以努力賺錢,是為了讓父母為自己買東西時(shí)能像給我們買東西時(shí)一樣大方!
          隨筆 - 7, 文章 - 0, 評(píng)論 - 10, 引用 - 0
          數(shù)據(jù)加載中……

          [java經(jīng)典算法題]有n個(gè)人圍成一圈,順序排號(hào)。從第一個(gè)人開始報(bào)數(shù)(從1到3報(bào)數(shù)),凡報(bào)到3的人退出圈子,問最后留下的是原來第幾號(hào)的那位?

          題目:有n個(gè)人圍成一圈,順序排號(hào)。從第一個(gè)人開始報(bào)數(shù)(從1到3報(bào)數(shù)),凡報(bào)到3的人退出圈子,問最后留下的是原來第幾號(hào)的那位?
           1package com.weidu.algorithms;
           2
           3import java.util.Arrays;
           4import java.util.Scanner;
           5
           6/**
           7 * @Title:
           8 * @Description:
           9 * @author Afei
          10 * @date: 日期:2012-6-10 時(shí)間:下午05:41:04
          11 * @Copyright:西北師范大學(xué)緯度工作室 Copyright (c) 2012
          12 * @version:1.0
          13 */

          14public class Qu3 {
          15
          16    /**
          17     * 功能說明:1、 有n個(gè)人圍成一圈,順序排號(hào)。從第一個(gè)人開始報(bào)數(shù)(從1到3報(bào)數(shù)),凡報(bào)到3的人退出圈子,<br>
          18     * 問最后留下的是原來第幾號(hào)的那位。
          19     * 
          20     * @Afei 2012-6-10
          21     * @param args
          22     */

          23
          24    public static void main(String[] args) {
          25        // TODO Auto-generated method stub
          26        Scanner input = new Scanner(System.in);
          27        System.out.print("請(qǐng)輸入總?cè)藬?shù):");
          28        int p = input.nextInt();
          29        /**** 初始化人員 ***/
          30        boolean[] per = new boolean[p];// boolean數(shù)組表示站成一圈的人,false表示退出
          31        for (int i = 0; i < per.length; i++{
          32            per[i] = true;
          33        }

          34
          35        /**** 報(bào)號(hào) ***/
          36        int t = 0, len = per.length;
          37        while (len > 1{
          38            for (int i = 0; i < per.length; i++{
          39
          40                if (per[i]) {
          41                    t++;
          42                    if (t == 3{
          43                        t = 0;
          44                        per[i] = false;
          45                        len--;
          46                    }

          47                }

          48            }

          49        }

          50        /***** 結(jié)果 *****/
          51        System.out.println("最后的情況:" + Arrays.toString(per));
          52        for (int i = 0; i < per.length; i++{
          53            if (per[i]) {
          54                System.out.println("原來喊的數(shù):" + (i + 1% 3);
          55            }

          56        }

          57    }

          58}

          59


          posted on 2012-06-12 00:08 feezh 閱讀(30772) 評(píng)論(7)  編輯  收藏 所屬分類: Java相關(guān)

          評(píng)論

          # re: [java經(jīng)典算法題]有n個(gè)人圍成一圈,順序排號(hào)。從第一個(gè)人開始報(bào)數(shù)(從1到3報(bào)數(shù)),凡報(bào)到3的人退出圈子,問最后留下的是原來第幾號(hào)的那位?  回復(fù)  更多評(píng)論   

          import java.util.Iterator;
          import java.util.Map;
          import java.util.TreeMap;


          /**
          * 遞歸算法實(shí)現(xiàn),改為非遞歸也非常easy
          * @author 李佳
          *
          */
          public class E
          {
          // 存儲(chǔ)人員編號(hào) 1....N和報(bào)號(hào) (1,2,3)的對(duì)應(yīng)關(guān)系
          private static TreeMap<Integer,Integer> tm = new TreeMap<Integer,Integer>();
          // 初始化 ,假設(shè)有100人
          public static void inint()
          {
          for(int i=1;i<=300;i++)
          {
          // 直接模3后會(huì)是1,2,0,將0改為3.
          tm.put(i, i%3==0?3:i%3);
          }
          }

          /**
          * 算法如下:
          *
          * 1 移除報(bào)號(hào)為3的人
          * 2 如果只剩兩人,則結(jié)束
          * 3 根據(jù)tm中最后一個(gè)人的報(bào)號(hào)M,重新計(jì)算每個(gè)人的報(bào)號(hào)
          * 即第一個(gè)人為(M+1)%3,第二個(gè)人為(M+2)%3
          * 4 重復(fù)第一步.
          *
          * 當(dāng)然最后剩下的兩人的報(bào)號(hào)肯定為1和2,若繼續(xù)下去的話,就是報(bào)號(hào)為2的那個(gè)人最終剩下.這一步我沒有寫
          */
          public static void compute()
          {
          // 1 移除報(bào)號(hào)為3的人
          Iterator<Map.Entry<Integer , Integer>> it = tm.entrySet().iterator();
          while(it.hasNext())
          {
          if(it.next().getValue().equals(3))
          {
          it.remove();
          }
          }
          // 2 如果只剩兩人,則結(jié)束
          if(tm.size()<=2)
          {
          return;
          }
          // 3 根據(jù)tm中最后一個(gè)人的報(bào)號(hào)M,重新計(jì)算每個(gè)人的報(bào)號(hào)
          // 即第一個(gè)人為(M+1)%3,第二個(gè)人為(M+2)%3
          resort();
          // 4 重復(fù)第一步.
          compute();
          }
          public static void resort()
          {
          // resort
          int last = tm.lastEntry().getValue();
          Iterator<Map.Entry<Integer , Integer>> it = tm.entrySet().iterator();

          while(it.hasNext())
          {
          last++;
          it.next().setValue(last%3==0?3:last%3);
          }
          }
          public static void display()
          {
          System.out.println(tm);
          }
          public static void main(String[] adfafd)
          {
          inint();
          compute();
          display();
          }

          }
          2012-06-15 16:28 | walnutprince

          # re: [java經(jīng)典算法題]有n個(gè)人圍成一圈,順序排號(hào)。從第一個(gè)人開始報(bào)數(shù)(從1到3報(bào)數(shù)),凡報(bào)到3的人退出圈子,問最后留下的是原來第幾號(hào)的那位?  回復(fù)  更多評(píng)論   

          @walnutprince
          謝謝,學(xué)習(xí)了
          2012-06-17 15:41 | afei

          # re: [java經(jīng)典算法題]有n個(gè)人圍成一圈,順序排號(hào)。從第一個(gè)人開始報(bào)數(shù)(從1到3報(bào)數(shù)),凡報(bào)到3的人退出圈子,問最后留下的是原來第幾號(hào)的那位?  回復(fù)  更多評(píng)論   

          Valuable information ..I am delighted to read this article..thank you for giving us this useful information. Great walk-through. I value this post.!!
          2012-10-30 13:30 | website design jp nagar

          # re: [java經(jīng)典算法題]有n個(gè)人圍成一圈,順序排號(hào)。從第一個(gè)人開始報(bào)數(shù)(從1到3報(bào)數(shù)),凡報(bào)到3的人退出圈子,問最后留下的是原來第幾號(hào)的那位?  回復(fù)  更多評(píng)論   

          @walnutprince
          和我的想法完全一樣
          2012-11-21 17:07 |

          # re: [java經(jīng)典算法題]有n個(gè)人圍成一圈,順序排號(hào)。從第一個(gè)人開始報(bào)數(shù)(從1到3報(bào)數(shù)),凡報(bào)到3的人退出圈子,問最后留下的是原來第幾號(hào)的那位?  回復(fù)  更多評(píng)論   

          下面那個(gè)遞歸resort方法有問題,如果剛好去除最后一個(gè)數(shù),剩下的最后一個(gè)數(shù)的value是2的話,本來是1的第一個(gè)數(shù)會(huì)變成3被去除;需要加一個(gè)判斷在resort方法里。輸入的數(shù)大于等于7就會(huì)跟上一題不同的答案
          2013-05-27 01:27 | jqy

          # re: [java經(jīng)典算法題]有n個(gè)人圍成一圈,順序排號(hào)。從第一個(gè)人開始報(bào)數(shù)(從1到3報(bào)數(shù)),凡報(bào)到3的人退出圈子,問最后留下的是原來第幾號(hào)的那位?  回復(fù)  更多評(píng)論   

          @website design jp nagar
          SB
          2013-10-20 16:39 | gfgrgr

          # re: [java經(jīng)典算法題]有n個(gè)人圍成一圈,順序排號(hào)。從第一個(gè)人開始報(bào)數(shù)(從1到3報(bào)數(shù)),凡報(bào)到3的人退出圈子,問最后留下的是原來第幾號(hào)的那位?  回復(fù)  更多評(píng)論   

          謝謝分享!
          2014-04-09 22:47 | Deen
          主站蜘蛛池模板: 东乡族自治县| 鄄城县| 偃师市| 大余县| 浮山县| 康乐县| 土默特左旗| 铜川市| 廊坊市| 南开区| 嘉定区| 宣城市| 卢氏县| 宁德市| 乌拉特后旗| 北京市| 板桥市| 富川| 宜川县| 保康县| 友谊县| 高台县| 剑川县| 长兴县| 福海县| 新野县| 唐海县| 监利县| 邢台县| 无锡市| 南丹县| 潜山县| 阿瓦提县| 乐安县| 信宜市| 孙吴县| 邓州市| 郧西县| 遂平县| 衢州市| 青浦区|