You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

HackerRank Closest Numbers问题:使用Tuple时两测试用例失败求助

解决HackerRank Closest Numbers测试用例失败问题

我在HackerRank的Closest Numbers问题中提交了下面的代码,4个测试用例通过了,但还有两个失败了,实在找不到问题出在哪,求帮忙排查!

#include <bits/stdc++.h>
using namespace std;
typedef tuple<int,int,int> tt;
bool sortbyasec(const tuple <int,int,int> &t1,const tuple <int,int,int> &t2) {
    return ((get<2>(t1) < get<2>(t2)) );
}
int main() {
    int TC;
    cin>>TC;
    vector <int> arr;
    for(int i = 0; i<TC; i++) {
        long long int x;
        cin>>x;
        arr.push_back(x);
    }
    sort(arr.begin(),arr.end());
    vector<tt> t1;
    int diff;
    for (size_t i = 0; i<arr.size()-1;i++) {
        diff = abs(arr[i] - arr[i+1]);
        t1.push_back(tt(arr[i],arr[i+1],diff));
    }
    arr.clear();
    sort(t1.begin(),t1.end(),sortbyasec);
    long int value;
    tie(ignore,ignore,value) = t1[0];
    for (size_t i = 0; i < t1.size();i++) {
        if (get<2>(t1[i]) == value) {
            cout<<get<0>(t1[i])<<' '<<get<1>(t1[i])<<' ';
        }
    }
}

问题分析与修复方案

仔细看了你的代码,发现三个可能导致测试用例失败的关键点:

  1. 数据类型溢出风险

    • 你用long long读取输入,但却存入vector<int>。如果输入数值超出int的范围(比如大于2^31-1或小于-2^31),会直接导致数据溢出,计算出来的差值也会错误。同时,diff定义为int,两个大整数的差也可能超出int范围,同样会溢出。
  2. 输出格式不符合要求

    • 你的代码在每对数后都输出空格,这会导致结果末尾多一个多余的空格。HackerRank的部分测试用例对格式要求严格,末尾空格会被判为错误。
  3. 排序逻辑不完整

    • 题目要求当多个数对的差值相同时,需要按数对的第一个元素升序排列;如果第一个元素相同,则按第二个元素升序。你的排序函数只比较差值,没有处理数对本身的顺序,会导致输出顺序不符合题目要求。

修复后的代码

#include <bits/stdc++.h>
using namespace std;
typedef tuple<long long, long long, long long> tt;

// 完善排序规则:先按差值升序,再按数对首元素升序,最后按次元素升序
bool sortbyasec(const tt &t1, const tt &t2) {
    if (get<2>(t1) != get<2>(t2)) {
        return get<2>(t1) < get<2>(t2);
    } else if (get<0>(t1) != get<0>(t2)) {
        return get<0>(t1) < get<0>(t2);
    } else {
        return get<1>(t1) < get<1>(t2);
    }
}

int main() {
    int TC;
    cin >> TC;
    vector<long long> arr;
    for (int i = 0; i < TC; i++) {
        long long x;
        cin >> x;
        arr.push_back(x);
    }
    sort(arr.begin(), arr.end());
    
    vector<tt> t1;
    for (size_t i = 0; i < arr.size() - 1; i++) {
        long long diff = abs(arr[i] - arr[i+1]);
        t1.emplace_back(arr[i], arr[i+1], diff);
    }
    
    sort(t1.begin(), t1.end(), sortbyasec);
    
    long long min_diff = get<2>(t1[0]);
    vector<long long> result;
    // 收集所有符合最小差值的数对元素
    for (const auto &t : t1) {
        if (get<2>(t) == min_diff) {
            result.push_back(get<0>(t));
            result.push_back(get<1>(t));
        }
    }
    
    // 控制输出格式,避免末尾空格
    for (size_t i = 0; i < result.size(); i++) {
        if (i != 0) {
            cout << " ";
        }
        cout << result[i];
    }
    cout << endl;
    
    return 0;
}

修复细节说明

  • 统一数据类型:将数组、差值、元组的类型全部改为long long,彻底避免溢出问题。
  • 完善排序逻辑:排序时优先比较差值,差值相同时比较数对的第一个元素,再比较第二个元素,确保输出顺序完全符合题目要求。
  • 优化输出格式:先把所有需要输出的元素收集到一个vector中,再遍历输出,这样可以精准控制空格,不会在末尾多出空格。

内容的提问来源于stack exchange,提问作者isilia

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 09:12:26