解法1:
import java.util.LinkedList;
import java.util.Queue;
public class SenatorVictory {
public String predictPartyVictory(String s) {
int n = s.length();
Queue<Integer> redQueue = new LinkedList<>();
Queue<Integer> darkQueue = new LinkedList<>();
// 初始化队列,存储各阵营参议员的索引
for (int i = 0; i < n; i++) {
if (s.charAt(i) == 'R') {
redQueue.add(i);
} else {
darkQueue.add(i);
}
}
// 模拟弹劾过程
while (!redQueue.isEmpty() && !darkQueue.isEmpty()) {
int redIndex = redQueue.poll();
int darkIndex = darkQueue.poll();
// 索引较小的先行动,弹劾对方阵营的下一位,自己进入下一轮
if (redIndex < darkIndex) {
redQueue.add(redIndex + n);
} else {
darkQueue.add(darkIndex + n);
}
}
// 队列非空的阵营获胜
return redQueue.isEmpty() ? "Dark" : "Red";
}
}
解法2:
import java.util.*;
public class Solution {
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 求出最终获胜帮派的名称
* @param s string字符串 包含'R'(红帮)和'D'(黑帮)的字符串
* @return string字符串 "Red"表示红帮获胜,"Dark"表示黑帮获胜
*/
public String predictVictory (String s) {
// 创建队列用于模拟参议员的循环行动顺序
Queue<Character> queue = new LinkedList<>();
// 统计初始时黑帮和红帮的参议员数量
int darknum = 0; // 黑帮(D)参议员数量
int rednum = 0; // 红帮(R)参议员数量
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (c == 'D') {
darknum++;
} else if (c == 'R') {
rednum++;
}
// 将所有参议员按初始顺序加入队列
queue.offer(c);
}
// 记录需要被弹劾的参议员数量
int darkout = 0; // 等待被弹劾的黑帮参议员数量
int redout = 0; // 等待被弹劾的红帮参议员数量
// 当双方都还有剩余参议员时,继续循环
while (darknum != 0 && rednum != 0) {
// 取出当前行动的参议员
char front = queue.poll();
// 处理黑帮参议员的行动
if (front == 'D') {
// 如果当前黑帮参议员不需要被弹劾
if (darkout == 0) {
// 选择弹劾一名红帮参议员
redout++;
// 自己进入下一轮循环
queue.offer(front);
// 红帮剩余数量减一
rednum--;
} else {
// 当前黑帮参议员被弹劾,减少待弹劾计数
darkout--;
}
}
// 处理红帮参议员的行动
else if (front == 'R') {
// 如果当前红帮参议员不需要被弹劾
if (redout == 0) {
// 选择弹劾一名黑帮参议员
darkout++;
// 自己进入下一轮循环
queue.offer(front);
// 黑帮剩余数量减一
darknum--;
} else {
// 当前红帮参议员被弹劾,减少待弹劾计数
redout--;
}
}
}
// 根据剩余数量判断获胜阵营
if (darknum == 0) {
return "Red";
}
if (rednum == 0) {
return "Dark";
}
// 理论上不会执行到这里,用于处理异常情况
return "Error";
}
}