此代码接受整数数组的输入,其中1≤ai≤n (n =数组大小),一些元素出现两次,另一些元素出现一次。我们得把丢失的号码还回去。
投入: 4,3,2,7,8,2,3,1产出: 5,6
它在Dev C++中运行得很好,但是当我提交一个名为leetcode的网站时,它会给我以下错误
运行时错误消息:
第924行: Char 9:运行时错误:引用绑定到'int‘(stl_vector.h)类型的空指针摘要: UndefinedBehaviorSanitizer:未定义-行为UndefinedBehaviorSanitizer
vector<int> findDisappearedNumbers(vector<int>& nums)
{
vector<int> temp;
const int len = nums.size();
int j=0;
//sorted the array
sort(nums.begin(), nums.end());
//Added non-repetitive numbers into a temp vector
for(int i=0;i<len;i++)
{
if(nums[i]!=nums[i+1])
{
temp[j++]=nums[i];
}
}
//cleared nums vector for later use
nums.erase(nums.begin(), nums.end());
//added missing numbers in the sequence to both temp and nums vectors
for(int i=0;i<len;i++)
{
if(temp[i]!=i+1)
{
temp.insert(temp.begin()+i, i+1);
nums.insert(nums.end(),i+1);
}
}
return nums;
}我知道这段代码效率很低,我刚刚开始使用c++,但是有人能告诉我为什么它不能在这个站点上工作吗?
发布于 2020-05-06 07:30:12
它似乎只在Dev C++中工作得很好。正如其他编译器的错误消息所述,您的代码中有未定义的行为。杰斯珀有指针一号。另一条路线是:
if(nums[i]!=nums[i+1])在上一次迭代期间,i等于len-1,因此nums[i+1]试图读取不存在的num[len]。您需要将循环更改为:
for(int i=0;i<len-1;i++)第二个循环更难修复。您使用len作为限制,但它是nums的旧长度,您正在temp上迭代。此外,在此期间您将修改temp。您需要做的是在每次迭代之后检查temp的大小,并将i与当前的数字进行比较:
for(int i=0;i<temp.size();i++)作为副词。有一些函数可以清除向量/在末尾添加元素。您可以找到完整的列表这里。
发布于 2020-05-06 07:12:44
当您这样做时,向量temp是空的:
temp[j++]=nums[i];因此,您正在访问超出范围的元素。这是未定义行为,您不能对结果抱有任何期望。什么事都有可能发生。一旦代码包含UB,编译器就不再有任何义务。
https://stackoverflow.com/questions/61629328
复制相似问题