各位前辈好,本人在做leetcode 179时碰到以下问题:

先放上可以被accept的解答:

class Solution {
public:
static bool comp(const int& A, const int& B) {
string a = to_string(A), b = to_string(B);
return a+b > b+a;
}
string largestNumber(vector<int>& nums) {
sort(nums.begin(), nums.end(), comp);
string res = "";
if (nums[0] == 0) return "0";

for (int num:nums) {
res += to_string(num);
}
return res;
}
};

但我如果用在comp里用stoll()的话就会出现奇怪的问题 (加上cout来debug):

class Solution {
public:
static bool comp(const int& A, const int& B) {
cout << "A: " << A << " B: " << B << endl; // Print the actual values
string a = to_string(A), b = to_string(B);
cout << "Concatenated: " << a + b << " vs " << b + a << endl;
return stoll(a + b) >= stoll(b + a);
}
string largestNumber(vector<int>& nums) {
sort(nums.begin(), nums.end(), comp);
string res = "";
if (nums[0] == 0) return "0";

for (int num:nums) {
res += to_string(num);
}

return res;
}
};

跑这个testcase:nums = [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0]

会跳出 heap-buffer-overflow 的错误,且印出

(省略前面)
A: 0 B: 0
Concatenated: 00 vs 00
A: -1094795586 B: 0
Concatenated: -10947955860 vs 0-1094795586
A: 0 B: 0
Concatenated: 00 vs 00
(省略后面)

这个 -1094795586 明显是 garbage value,不知从何而来,麻烦c++高手提点,谢谢!

1 个回答

3

meebox

iT邦新手 3 级 ‧ 2024-09-19 10:53:56

最佳解答

你的这一行:

return stoll(a + b) >= stoll(b + a);

是主要出错的原因, 提供给 sortcmp 函数必须要符合 cmp(x, x) 一定是 false, 只要改成这样就可以正确执行了:

return stoll(a + b) > stoll(b + a);

  • 2

ffaanngg

iT邦新手 5 级 ‧
2024-09-19 12:29:29

谢谢,原来还有这个小地方要注意,厉害

修改

meebox

iT邦新手 3 级 ‧
2024-09-20 09:29:37

可参考我整理的文章

修改