java解答:有17個人圍成一圈(編號0~16),從第0號的人開始從1報數,凡報到3的倍數的人離開圈子,然后再數下去,直到最后只剩下一個人為止,問此人原來的位置是多少號?


package ttt;

import java.util.HashMap;
import java.util.Map.Entry;

/**
 * 有17個人圍成一圈(編號0~16),從第0號的人開始從1報數,凡報到3的倍數的人離開圈子,然后再數下去,
 * 直到最后只剩下一個人為止,問此人原來的位置是多少號?
 *
 */
public class n人報數m時離開 {

    public static void main(String[] args) {
        HashMap<Integer, Integer> theQuee = new HashMap<Integer,Integer>();
        for (int i = 0; i < 17; i++) {
            theQuee.put(i, i+1);//編號,固定位置
        }
        HashMap<Integer, Integer> itretMap = itretMap(theQuee,theQuee.size());
        for (Entry<Integer,Integer> entry  : itretMap.entrySet()) {
            if(entry.getValue()!= 0){
                System.out.println("結果:"+entry.getKey());
            }
        }
    }

    //遍歷Map並給非3的倍數的Key的value+1
    public static HashMap<Integer, Integer> itretMap(HashMap<Integer,Integer> map,int lenth){
        int sum = 0;
        for (Entry<Integer,Integer> entry : map.entrySet()) {
            int value = entry.getValue();
            if(value%3 != 0){//不可以整除
                entry.setValue(value+lenth);//
                sum++;//進入下一輪
            }else{
                if(0!=entry.getValue()){//避免重復淘汰
                    entry.setValue(0);//淘汰
                    lenth --;//參與者-1
                }
            }
        }
        if(sum>1){//
            System.out.println("還要繼續,還有:"+sum);
            return itretMap(map,sum);
        }else{//已決出勝出者
            return map;//返回map
        }
    }
}

加班回來的路上看到一個這樣的題,題目就是標題,

(原題地址:http://www.cnblogs.com/tonybinlj/archive/2009/01/04/1367856.html),然后自我感覺用了個比較拙劣的方式,最后還是實現了。這里的17和3當然可以當做參數m,n來處理。。
弄完網上找了找。C系列實現形式思路基本上是一樣的。
然后數學好的三行代碼就搞定了。。遍歷次數也是最少的。效率達到O(n):
    public static void main(String[] args) {
        int n =0;
        for (int i = 2; i <= 17; i++) {
            n = (n+3)%i;
        }
        System.out.println(n);
    }
            

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



猜您在找 有17個人圍成一圈(編號為0~16),從第 0號的人開始從 1報數, 凡報到 3的倍數的人離開圈子,然后再數下去,直到最后只剩下一個人為止。 問此人原來的位置是多少號? 有10個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是第幾號的人 有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位。 有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位。 【JAVA習題二十七】有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下 報數問題:有n個人圍成一圈,順序排號。從第一個人開始報數(從1到3報數),凡報到3的人退出圈子,問最后留下的是原來第幾號的那位 C語言——N個人圍成一圈報數淘汰問題 一個概率題:54張撲克牌,除去兩張大小王剩下52張撲克牌。問紅桃A和黑桃A同時被一個人拿到的概率是多少? 對於一個由0..n的所有數按升序組成的序列,我們要進行一些篩選,每次我們取當前所有數字中從小到大的第奇數位個的數,並將其丟棄。重復這一過程直到最后剩下一個數。請求出最后剩下的數字。 用篩選法可得到2~n(n<10000)之間的所有素數,方法是:首先從素數2開始,將所有2的倍數的數從數表中刪去(把數表中相應位置的值置成0);接着從數表中找出下一個非0數,並從數表中刪去該倍數的所有倍數; 以此類推,直到所找到的下一個數等於n為止。這樣會得到一個序列:2,3,5,7,11,13,17,19,23...
 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM