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));
}
}
}