题解 | #约瑟夫问题I#
约瑟夫问题I
http://www.nowcoder.com/questionTerminal/11b018d042444d4d9ca4914c7b84a968
- 数学的递推方法很巧妙,但推导需要时间
- 直接采用队列进行模拟 比较容易理解
- 循环队列的精髓在于: 符合条件:直接将队头元素取出,放到队尾;否则 直接取出丢弃
class Joseph {
public:
int getResult(int n, int m) {
queue<int>s;//队列
for(int j=1;j<=n;j++){//初始元素入队(1~n)
s.push(j);
}
while(!s.empty()){
for(int i=1;i<m;i++){//前m-1个从队头取出,放到队尾
s.push(s.front());
s.pop();
}
s.pop();//数到m个,丢掉一个
if(s.size()==1){//只剩一个,结束
break;
}
}
return s.front();
}
};