C++求婚者淘汰问题代码编译通过但提交检测无输出,求排查修复
问题排查
核心错误点
- 现有代码未计算下一轮待淘汰元素的索引:淘汰当前元素后,没有按规则向后数3位定位下一个淘汰目标,仅在eliminated越界时做了回卷,会直接导致数组访问越界崩溃或者死循环无输出。
- 越界判断规则错误:vector的合法索引范围是
0 ~ sizeSuitors - 1,判断条件应为eliminated >= sizeSuitors,而非eliminated > sizeSuitors。
逻辑修正思路
这是典型的步长为3的约瑟夫环问题,正确的索引更新规则如下:
- 淘汰索引为
eliminated的元素后,下一轮计数的起点就是当前eliminated对应的位置(元素删除后后续元素整体前移1位,原eliminated + 1的元素已经移动到eliminated位置) - 向后数3个得到下一个淘汰索引,等价于在当前
eliminated的基础上加2(起点本身为第1个计数单位),再对当前队列长度取模实现自动回卷,无需单独写if判断处理越界。
修正后代码
int processSuitors(vector<int>& currentSuitors, list<int>& rekt) { int sizeSuitors = currentSuitors.size(); int eliminated = 2; // 第一轮淘汰索引2的元素,对应第3个求婚者 while(sizeSuitors != 1) { rekt.push_back(currentSuitors[eliminated]); currentSuitors.erase(currentSuitors.begin() + eliminated); sizeSuitors--; if(sizeSuitors > 0) { eliminated = (eliminated + 2) % sizeSuitors; } } return currentSuitors[0]; }
优化说明
- 用取模操作替代单独的越界判断,逻辑更简洁,避免边界判断错误问题
- 完全符合题目限制:仅使用了题目允许的STL函数,未自行创建任何额外容器。
内容的提问来源于stack exchange,提问作者Sandra
相关产品推荐
相关产品推荐

