题目如下:
一群小孩手拉手围成一圈,从第一个小孩开始数数,1,2,3.某个小孩数到3的时候退出该圈.他的下一个小孩又从1开始数,下面的小孩数到3的时候又退出.数完后,会有最后一个小孩。问:最后那个小孩是圈中的第几个小孩?
第一种方法:用数组解决,代码如下:
public class Count3Exit{ public static void main(String[] args){ boolean[] arr = new boolean[500]; for(int i = 0;i < arr.length;i++){ arr[i] = true; } System.out.println("***********"); int leftCount = arr.length; int Count = 0; int index = 0; while(leftCount > 1){ if(arr[index] == true){ Count++; //index++ if(Count == 3){ Count = 0; arr[index] = false; leftCount--; } } index++; if(index == arr.length){ index = 0; } } for(int i = 0;i < arr.length;i++){ if(arr[i] == true) System.out.println(i); } } }
第二种方法:面向对象思路,双向循环链表,代码如下:
public class Count3Exit2{ public static void main(String[] args){ KidCircle kc = new KidCircle(500); int num = 0; Kid k = kc.first; while(kc.count > 1){ num ++; if(num == 3){ num = 0; kc.delete(k); } k = k.right; } System.out.println(kc.first.id); } } class Kid{ int id; Kid left; Kid right; } class KidCircle{ int count = 0; Kid first; Kid last; KidCircle(int n){ for(int i = 0;i < n;i++){ add(); } //System.out.println(count); } void add(){ Kid kid = new Kid(); kid.id = count; if(count <= 0){ first = kid; last = kid; kid.left = kid; kid.right = kid; }else{ last.right = kid; kid.left = last; kid.right = first; first.left = kid; last = kid; } count ++; } void delete(Kid k){ if(count <= 0){ System.out.println("圈里没人..."); }else if(count == 1){ first = last = null; }else{ k.left.right = k.right; k.right.left = k.left; if(k == first){ first = k.right; }else if(k == last){ last = k.left; } } count --; } }