算法 (数组)

选出队长问题 (数组)

问题描述: 有爬山队员 n 人参与这个选队长游戏, 现在需要选出一个人作为队长,这n个人排在一个数组中,选队长规则如下:从队伍头开始,每个人从1开始报数,报数到3则被淘汰,剩下的人继续参与选队长,直至剩最后一人

比如下面这个数组中,有a, b, c, d, e五个队员,从a开始报数

abcde
123
第一轮被淘汰: c,剩下四人继续
abcde
312
第二轮被淘汰: a,剩下三人继续
abcde
123
第二轮被淘汰: e,剩下两人继续
abcde
12
3
第二轮被淘汰: 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数组

/**
* Space Complexity: O(n) , Time Complexity:O(n)
* @author: RichardWWHH
* @input: String nums[]: 0 < nums.length < 10^9
* @output: int indOfLeader
*/
public class Main{
	public static void main(String[] args) {
		//test case
	}
	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才增加
					count++;
				}
				if (count == 3) {//淘汰第index上的人,并且要将剩余人数-1,count置0
					valid[index] = true;
					count = 0;
					left--;
				}
			}
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值