1~10十个人进行编号,开始报数,报到3的人淘汰,剩余的人是编号为几的人?
解题思路:设置一个长度为11的数组,其中索引为0的位置不进行编号,这索引和索引对应元素的值是意义对应的,即index==arr[index],被淘汰的人其元素值置为-1,用来标记其被淘汰。定义一个计数器count1来计数已经被淘汰的人,每当一个被淘汰时,计数器就加1。当计数器的值为9时,即10个人只剩一人,此时退出程序。此外还需要一个计数器count用来决策那个人会被淘汰,计数器数到3,计数器重置为0,淘汰一个人。
class Solution{
public static int circle(){
int[] arr = new int[11];//0索引不用,所以数组长度加1
for(int i=1;i<=10;++i){
arr[i] = i;
}
int index = 0;//
int count = 0;
int count1 = 0;
while(true){
index += 1;
count += 1;
//超过数组长度时,需更新index
index = (index>=1 && index<=10)?index:(index % arr.length)+1;
if(3==count){
count = 0;
arr[index] = -1;
count1 += 1;
}
if(9==count1)break;
}
for(int i=1;i<=10;++i){
if(arr[i]!=-1)
return i;
}
return -1;
}
}