选出队长问题 (数组)
问题描述: 有爬山队员 n 人参与这个选队长游戏, 现在需要选出一个人作为队长,这n个人排在一个数组中,选队长规则如下:从队伍头开始,每个人从1开始报数,报数到3则被淘汰,剩下的人继续参与选队长,直至剩最后一人
比如下面这个数组中,有a, b, c, d, e五个队员,从a开始报数
第一轮被淘汰: c,剩下四人继续
第二轮被淘汰: a,剩下三人继续
第二轮被淘汰: e,剩下两人继续
第二轮被淘汰: b,剩下d,结束 d为队长
算法思路:大体上就是不断遍历这个数组,然后将数到③的人设置为-1(空间复杂度O(1),或者另外创建与输入数组大小相同一个boolean[] valid将数到③的位置置为true).
1.1 可以用两个循环实现,外层循环计算一共要淘汰几轮 (由于最后只剩一个人,需要n-1次)
1.2 内层循环中还需设置count,如果遇到未排除的人:count++,否则count 不发生改变,此时内层循环的index++,当count==3时:设置该位置的数组元素为-1或者将valid中对应位置设置为true,然后重置count = 0
由于输入不能改变,下面代码引入了boolean[] valid数组
public class Main{
public static void main(String[] args) {
}
public static int findLeader(String[] nums) {
boolean[] valid = new boolean[nums.length];
int count = 0;
int left = nums.length;
while(left > 1) {
for(int index = 0; index < nums.length; index++) {
if(valid[index] == false) {
count++;
}
if (count == 3) {
valid[index] = true;
count = 0;
left--;
}
}
}
}
}