解法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"; } }