HackerRank袜子配对计数问题:C++代码输出结果偏差求解
代码问题定位
核心触发原因
你的逻辑缺了最后一组同色袜子的配对数计算。
当你遍历完排序后的数组时,如果数组末尾连续出现多个相同颜色的袜子,循环会在到达最后一个元素前就终止,根本不会触发else分支的配对数累加逻辑——只有遇到颜色变化时才会计算当前颜色的可配对数,而最后一段连续同色的区间永远不会被走到计算分支。
拿你给的示例代入走一遍流程就能复现你的输出:
排序后的数组为[1,1,1,1,2,3,3,3,3,3]
- 遍历到数组中颜色从1变2的位置时,累加1色的配对数:4只袜子 → 2对,count=2
- 遍历到颜色从2变3的位置时,累加2色的配对数:1只袜子 → 0对,count保持2
- 接下来连续5只3色袜子,遍历过程中
sum一直累加到5,但因为已经走到循环边界(i最大到n-2=8),循环直接结束,这部分的2对3色袜子根本没有被加进count里 - 最终输出的count就是2,和你遇到的错误完全一致
修复方法
- 循环全部执行完成后,手动补上最后一组同色袜子的配对计算:加上
count += sum / 2; - 额外提一个非逻辑问题:你代码里写的
int arr[n]属于可变长度数组(VLA),不是C++标准支持的语法,虽然GCC等编译器会兼容,但换严格遵循标准的编译器会直接编译报错,建议换成标准写法的vector<int> arr(n),对应的sort调用也要改成sort(arr.begin(), arr.end())
修复后可正确运行的代码
#include <bits/stdc++.h> using namespace std; int main() { int n; cin >> n; vector<int> arr(n); for(int i = 0; i < n; i++) cin >> arr[i]; sort(arr.begin(), arr.end()); int sum = 1, count = 0; for(int i = 0; i < n-1; i++) { if(arr[i] == arr[i+1]) sum += 1; else { count += sum / 2; sum = 1; } } // 补算最后一组同色的配对数 count += sum / 2; cout << count; }
内容的提问来源于stack exchange,提问作者Krishna
相关产品推荐
相关产品推荐

