class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* 求出最终获胜帮派的名称
* @param s string字符串
* @return string字符串
*/
string predictVictory(string s) {
// write code here
//本题答案来自@Silencer76,笔者提交了n遍没通过于是选择看题解,下面说一些自己的理解
//本题主要难在投票权的应用,需要有一个先后顺序,以及将议员加入下一轮循环
//先后顺序这里巧妙地将入队元素改成对应的索引,循环则是使用了一个+n的方式,请看:
queue<int> r,d;//定义两个队列
for(int i=0;i<s.size();i++)//遍历字符串,将对应索引加入队列
{
if(s[i]=='R')
{
r.push(i);
}
else {
d.push(i);
}
}
while(!r.empty()&&!d.empty())
//只要红帮和黑帮有一方还剩有议员,则循环继续
{
int r_idx=r.front();//定义一个索引变量,使其等于红帮队首的索引
r.pop();//删除队首,表示已投票或被投出
int d_idx=d.front();//同上
d.pop();
if(r_idx<d_idx)//索引小的可以先投出索引大的
{
r.push(r_idx+s.size());
//这里没有使用pop,而是将自己队伍的人加入下一轮投票,非常巧妙
//反过来想,自己人增加了是不是也相当于对方减少了呢?删除的操作在上面就进行了
}
else {
d.push(d_idx+s.size());
}
}
return r.empty()?"Dark":"Red";//返回获胜的帮派,这个用法其实不推荐,if可读性比较强
}
};