约瑟环问题:15个人,15个坏人,怎么排序,每次数到9干掉一个坏人?
数组解法
Boolean[] usaJapa=new Boolean[30];
for (int i = 0; i < usaJapa.length; i++) {
usaJapa[i]=true;
}
//此解法适用保留坏人原位置,即原本呆的地方
public static void arrayJose(Boolean[] usaJapa) {
int leftCount=usaJapa.length;
int countNum=0;
int index=0;
while (leftCount!=15) {
countNum++;
if (countNum %9==0) {
usaJapa[index]=false;
leftCount-- ;
}
index++;
if (index==usaJapa.length) {
index=0;
}
}
int a=0,b=0;
for (int i = 0; i < usaJapa.length; i++) {
if(usaJapa[i]==false) a++;
if (usaJapa[i]) {
b++;
}
}
System.out.println("a = "+a+", b= "+b);
}
与上解法雷同
public static void john(Boolean[] usaJapa){
int index=0;
int countsum=1;
int count=0;
int[] record=new int[15];
while(countsum<=15){
if(count==8){
count=0;
usaJapa[index]=false;
record[countsum-1]=index;
countsum++;
}
if(usaJapa[index]==true){
count++;
}
index++;
if(index==usaJapa.length){
index=0;
}
}
for(int k=0;k<15;k++){
System.out.println("坏人位置:"+record[k]);
}
int a=0,b=0;
for (int i = 0; i < usaJapa.length; i++) {
if(usaJapa[i]==false) a++;
if (usaJapa[i]) {
b++;
}
}
System.out.println("a = "+a+", b= "+b);
}
以上两种解法,只能干掉10个或者更少的人,如果要干掉更多。需要用到干掉15人的话,需要用到指向位置标记。如下图
public static void arrayJose(Boolean[] usaJapa) {
int leftCount=usaJapa.length;
int countNum=0;
int index=0;
while (leftCount!=15) {
countNum++;
index++;
if (countNum %9==0) {
usaJapa[index]=false;
leftCount-- ;
index--;
}
//index++;
if (index==usaJapa.length) {
index=0;
}
}
int a=0,b=0;
for (int i = 0; i < usaJapa.length; i++) {
if(usaJapa[i]==false) a++;
if (usaJapa[i]) {
b++;
}
}
System.out.println("a = "+a+", b= "+b);
}
输出 a = 15, b= 15
[true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false, true, false]
用list解
public static void joseList2(){
List<Integer> list=new ArrayList<Integer>();
for (int i = 0; i < 30; i++) {
list.add(i);
}
int countNum=1,index=0;
while (list.size()>15) {
countNum++;
index++;//当前指向下一个位置
if (countNum%9 ==0) {
list.remove(index);
index--;//返回初始位置,便于下一次指向位置
}
if (index==list.size()) {
index=0;//环形
}
}
for(int a:list){
System.out.print(" "+a);
}
}
用迭代器更好
public static void listJose() {
/**
* list解
*/
//30人围成一圈
List<Integer> personCycle=new ArrayList<Integer>();
for(int i=1;i<=30;i++){
personCycle.add(i);
}
//报号开始位置
int callNum=1;
while (personCycle.size()>15){
for(Iterator<Integer> it=personCycle.iterator();it.hasNext();){
Integer no=(Integer)it.next();//跌打器指向
if(callNum++==9){
System.out.println("位置: "+(no-1));
it.remove();
callNum=1;
}
}
}
System.out.println("集合排序: "+personCycle.toString());
}
从以上解法,可以看出,迭代器方便简洁,而且迭代器iterator具有next,自动指向下一个。
在家无聊,排序看看解法
排序后,这个排序挺好的