题解 | 孩子们的游戏(圆圈中最后剩下的数)
孩子们的游戏(圆圈中最后剩下的数)
https://www.nowcoder.com/practice/f78a359491e64a50bce2d89cff857eb6
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param n int整型 * @param m int整型 * @return int整型 */ int LastRemaining_Solution(int n, int m) { list<int> nums; for(int i = 0; i < n; ++i) nums.push_back(i); auto it = nums.begin(); // 迭代器模拟指针, 指向当前起始位置 while(nums.size() > 1) { for(int i = 0; i < m - 1; i++) { it++; if(it == nums.end()) it = nums.begin(); // 循环链表, 到末尾回到开头 } // 删除当前节点, it 自动指向下一个节点的位置 (或重新定位, 因 list 删除后迭代器失效需处理, 不过 C++11 后可简化) it = nums.erase(it); if(it == nums.end()) it = nums.begin(); // 若删到末尾, 重置到开头 } return *nums.begin(); } };
使用 list 链表进行模拟!!!