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])<<' '; } } }
问题分析与修复方案
仔细看了你的代码,发现三个可能导致测试用例失败的关键点:
数据类型溢出风险
- 你用
long long读取输入,但却存入vector<int>。如果输入数值超出int的范围(比如大于2^31-1或小于-2^31),会直接导致数据溢出,计算出来的差值也会错误。同时,diff定义为int,两个大整数的差也可能超出int范围,同样会溢出。
- 你用
输出格式不符合要求
- 你的代码在每对数后都输出空格,这会导致结果末尾多一个多余的空格。HackerRank的部分测试用例对格式要求严格,末尾空格会被判为错误。
排序逻辑不完整
- 题目要求当多个数对的差值相同时,需要按数对的第一个元素升序排列;如果第一个元素相同,则按第二个元素升序。你的排序函数只比较差值,没有处理数对本身的顺序,会导致输出顺序不符合题目要求。
修复后的代码
#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
相关产品推荐
相关产品推荐

