1. 程式人生 > >java陣列經典題目:數3退1;每數到3就退出一個人,求最後剩下一個人的編號;

java陣列經典題目:數3退1;每數到3就退出一個人,求最後剩下一個人的編號;

import java.util.Arrays;

public class Tes {
    public static void main(String[] args) {
        // 數3退1;每數到3就退出一個人,求最後剩下一個人的下標;
        boolean people[] = new boolean[500];
        Arrays.fill(people, true);
        int count = 0;//記錄該人為第幾個數(迴圈)
        int length = people.length;// 陣列內為true值的總數
        while (length > 1) {// 當值為true的數只有一個時,結束迴圈
            for (int i = 0; i < people.length; i++) {// 確認陣列內每個數的值
                if (people[i]) {// 確認陣列內為true的有效值 ,為false表示已經移除
                    count++;
                    /*
                     * 在此容易犯的錯
                     * 思路:為true值時,才會有後續操作,為false,什麼都不變化
                     * 所以,下一個if條件為該if的子條件,在大括號裡面,不在外面
                     * 如果將下個if與當前if平級
                     * 舉例:當進行第2輪遍歷時 
                     * 501=ture, i=0,count%3=0,people[0](501)=false,length--;
                     * 502=ture,i=1,count%3=1,people[1](502)=false,length--;
                     * 503=false,i=2,count%3=0,people[2](503)=false,length--;
                     *
                     * 可以看出,為false時,length,同樣會減少,演算法邏輯出現錯誤*/
                    if (count % 3 == 0) {// 移除人員,並減少值為true的總人數
                        people[i] = false;
                        length--;
                    }
                }
            }
        }
        // 迴圈,判斷,輸出最後剩下值為true的下標+1(編號從1開始)
        for (int j = 0; j < people.length; j++) {
            if (people[j])
                System.out.println("剩餘的小孩的編號為:" + (j + 1));
        }
    }
}