[c ++中使用向量的问题解决方案在提交时显示but,但在使用自定义输入运行相同输入时运行良好

问题描述 投票:0回答:1

最近我正在interviewbit.com-https://www.interviewbit.com/problems/merge-intervals/上解决此问题。我使用向量和对向量执行操作解决了这个问题。这是我的代码:

    vector<Interval> Solution::insert(vector<Interval> &intervals, Interval newInterval)
    {

    int n=intervals.size(),leftfound=0,rightfound=0,count=0;
    if(n==0)//for the case when intervals vector is empty
    {  intervals.push_back(newInterval);
    return intervals;}

    int t=0;
    if(newInterval.end<newInterval.start)//if(start>end) swap
    { 
    t=newInterval.start;
    newInterval.start=newInterval.end;
    newInterval.end=t;
    }
    if(newInterval.start>intervals[n-1].end)//if the newInterval succedes every other
    {
    intervals.insert(intervals.end(),newInterval);
    return intervals;
        }
    if(newInterval.end<intervals[0].start)//if the newInterval is precedes every other
    {
    intervals.insert(intervals.begin(),newInterval);
    return intervals;
      }

    auto left=intervals.begin(),right=intervals.begin(); //just initialising with something
    auto it=intervals.begin() ; // iterator for loops

    while((*it).start<newInterval.start&&it!=intervals.end()) //*it is dereferencing the iterator to 
    {                                                                //get the element of vector "intervals" at that index
    it++;}

    it--; // decrementing it to reach the desired interval

    if((*it).start<=newInterval.start&&(*it).end>=newInterval.start)
    {leftfound=1;left=it;}
    else left=it+1;

    it=left;

    while((*it).end<newInterval.end&&it!=intervals.end())
    it++;

if((*it).start<=newInterval.end&&(*it).end>=newInterval.end)
{ rightfound=1; right=it;
}
else right=it-1;


if(right-left==-1&&leftfound==0&&rightfound==0)// this if will be true in cases like:
   intervals.insert(left,newInterval);          //intervals=[(1,2),(8,10)] and newInterval=(4,6)

else        //in every other case this else will execute
{   
   if(leftfound==0)
   (*left).start=newInterval.start;
   if(rightfound==0)
   (*left).end=newInterval.end;
   else (*left).end=(*right).end;
   //count=right-left;

  }
  left=left+1;
  //while(count--)
  //cout<<"current left pe value hai : ("<<left->start<<", "<<left->end<<")"<<endl;
  //cout<<"current right pe value hai : ("<<right->start<<", "<<right->end<<")"<<endl;

   intervals.erase(left,right+1);
return intervals;
}

the visitbitbit.com ide平台仅需要完成问题中提到的功能

注意:您只需要实现给定的功能。不要读取输入,而是使用函数的参数。不打印输出,而是返回指定的值。还有疑问吗?检出示例代码以了解更多详细信息。

即我们需要实现:

vector<Interval> Solution::insert(vector<Interval> &intervals, Interval newInterval) { }

也将间隔结构定义为:

struct Interval {
    int start;
    int end;
    Interval() : start(0), end(0) {}
    Interval(int s, int e) : start(s), end(e) {}
};

现在,使用站点上的测试按钮进行测试时,此解决方案可以正常运行。之后,当我按提交时,它显示以下错误:click to see error。当我使用自定义输入运行相同的测试用例(遇到错误)时,代码运行良好并给出了预期的输出。我似乎找不到问题所在。我怀疑这可能是由于擦除功能,因为在错误中它显示“ free()”,但我什至无法肯定。我还在ideone.com上运行了代码,在代码中添加了结构和主要功能,它运行得非常好。请帮助。

c++ vector error-handling runtime-error out-of-memory
1个回答
0
投票
intervals.insert(left,newInterval); 

std::vector::insert使向量的所有现有迭代器无效。之后立即:

left=left+1;

intervals.erase(left,right+1);

到同一向量的leftright迭代器在这一点上不再有效,并且使用它们是未定义的行为。

这可能是也可能不是所示代码中的唯一错误。缩进的缩进使得所显示的代码难以阅读和遵循;但这是显示的代码中的确定错误,这很可能是未定义行为和崩溃的原因。

© www.soinside.com 2019 - 2024. All rights reserved.