You need to enable JavaScript to run this app. HackerRank袜子配对计数问题:C++代码输出结果偏差求解
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.11.02 03:15:05