1.题目


2.思路


把所有下标看成时间线:
第一轮时间:0,1,2,...,n-1
第二轮时间:n,n+1,...,2n-1
第三轮时间:2n,...
某人第一次在 i 时刻行动,下一次自然在 i+n,再下一次 i+2n......
队列就是在维护"谁下一次最早行动"。
放队尾:表示"他还活着,下一轮还会回来投票"
+n:表示"他的下一次出场发生在下一轮(排到本轮所有人后面)"

3.代码实现
java
class Solution {
public String predictPartyVictory(String senate) {
int n=senate.length();
Queue<Integer> ra=new ArrayDeque<Integer>();
Queue<Integer> di=new ArrayDeque<Integer>();
for(int i=0;i<n;i++)
{
if(senate.charAt(i)=='R')
{
ra.offer(i);
}else{
di.offer(i);
}
}
while(!ra.isEmpty()&&!di.isEmpty())
{
int raInndex=ra.poll();
int diIndex=di.poll();
if(raInndex<diIndex)
{//坐标小的,可以投敌方的反对票。
//并且可以在下一轮再投敌方反对票,所以要+队列的长度,放在队尾
ra.offer(raInndex+n);
}else{
di.offer(diIndex+n);
}
}
if(!ra.isEmpty())
{
return "Radiant";
}else{
return "Dire";
}
}
}