【发布时间】:2019-05-14 20:43:31
【问题描述】:
所以我正在解决 Leetcode 912 上的问题。这是一个尽可能简单的问题——按升序对数组进行排序。我只是为了检查所有的排序算法。但是,当涉及到合并排序时,我编写了这个算法,它显示了一个运行时错误,如下所示。一些包含 6 或 10 个整数的简单测试用例通过了。但是当涉及到更长的测试用例时会发生运行时错误。任何人都知道我的代码的哪一部分可能会导致这种情况?非常感谢!
void mergesort(vector <int> &nums) {
int length=nums.size();
if (length<2)
{
return ;
}
int mid= length/2;
vector <int> left;
vector <int> right;
for (int x=0;x<mid;x++)
{
left.push_back(nums[x]);
}
for (int y=0;y<length-mid;y++)
{
right.push_back(nums[y+mid]);
}
mergesort(left);
mergesort(right);
merge(left,right,nums);
}
void merge(vector <int>& left,vector <int>& right,vector <int>& nums){
int i,j,count {0};
int l1=left.size();
int l2=right.size();
while (i<l1&&j<l2)
{
if (left[i]<right[j])
{
nums[count]=left[i];
count++;
i++;
}
else
{
nums[count]=right[j];
count++;
j++;
}
}
while (i<l1)
{
nums[count]=left[i];
count++;
i++;
}
while (j<l2)
{
nums[count]=right[j];
count++;
j++;
}
}
vector<int> sortArray(vector<int>& nums){
mergesort(nums);
return nums;
}
我通过了这样的测试用例:[5,2,3,1] 但是对于更长的向量输入: 我收到运行时错误消息:AddressSanitizer: SEGV on unknown address 0x61eff7f80674 (pc 0x000000418d91 bp 0x7fff0f0847c0 sp 0x7fff0f0845a0 T0)
【问题讨论】:
-
建议 -- 在您的计算机上安装编译器。编写你的程序,测试它,调试它。满意后,然后将代码提交给“leetcode”。现在,您依赖于围栏后面的一些编译器,没有调试器之类的工具——现实世界中没有人学习如何以这种方式编写程序。如果您想修复错误,请在本地修复它们——如果“leetcode”由于某种原因离线并且您现在无法修复问题怎么办?
-
int i,j,count {0};-->int i=0, j=0, count=0; -
PaulMcKenzie,谢谢您的建议。我在我的电脑上使用 CodeLite 和 VS Code 进行编程、调试和测试。我试图在 CodeLite 上重现该错误,但未能这样做。这就是为什么我说错误来自 Leetcode。
-
您的编译器应该警告您未初始化的变量使用情况。
标签: c++ arrays algorithm sorting mergesort