C++ LeetCode删除c+中的重复项+;

C++ LeetCode删除c+中的重复项+;,c++,C++,leetCode问题希望我们删除重复项,并返回最终数组。我只是不知道为什么我的有运行时错误。我暂时没有使用C++,但我检查了在线日志和擦除函数。有人能帮我吗 class Solution { public: int removeDuplicates(vector<int>& nums) { if(nums.size()==0) return 0; for(vector<int>::iterator iter = nums.begin();

leetCode问题希望我们删除重复项,并返回最终数组。我只是不知道为什么我的有运行时错误。我暂时没有使用C++,但我检查了在线日志和擦除函数。有人能帮我吗

class Solution {
public:
int removeDuplicates(vector<int>& nums) {
    if(nums.size()==0)
        return 0;

for(vector<int>::iterator iter = nums.begin();iter!=nums.end();iter++)
  {
      if(*iter == *(iter+1))
      {
          nums.erase(iter+1);
          iter++;
     }

  }
    return nums.size();
}
};
类解决方案{
公众:
int-removeDuplicates(向量和nums){
如果(nums.size()==0)
返回0;
对于(向量::迭代器iter=nums.begin();iter!=nums.end();iter++)
{
如果(*iter==*(iter+1))
{
数值擦除(iter+1);
iter++;
}
}
返回nums.size();
}
};

您可以直接从测试用例的控制台/文件输入中删除重复项,而无需首先将所有值存储在一个数组中。您可以使用
std::unordered_set
存储从cin读取的值。 大概是这样的:

std::unordered_set<int>arr;
int test_cases;
cin>>test_cases;
while (test_cases--)
{
    int x;
    cin >> x;
    arr.insert(x);
}
std::无序设置;
int测试用例;
cin>>测试案例;
而(测试用例--)
{
int x;
cin>>x;
arr.insert(x);
}

您正在循环中增加两次iter

for(vector<int>::iterator iter = nums.begin();iter!=nums.end();iter++)
        {
            if(*iter == *(iter+1))
            {
                nums.erase(iter+1);
                iter++
            }

        }
for(向量::迭代器iter=nums.begin();iter!=nums.end();iter++)
{
如果(*iter==*(iter+1))
{
数值擦除(iter+1);
iter++
}
}
if语句中的一个导致iter超出范围。 无需在if语句中增加iter

编辑:最好指出,删除向量会使迭代器无效。所以仅仅删除重复的增量是不够的。这里有更多的信息


最后,这种迭代不足以删除散布在向量周围的重复数字,例如
0110
010
,调用擦除将使迭代器无效。然而,erase方法返回一个新的迭代器。代码需要小心,不要使用iter+1逻辑超过最后一个元素。我已经在下面修改了你的代码

我还包括一个更现代的风格,从,使用删除_如果和一套。它避免了一些迭代器混淆。它也适用于未排序的向量。但是,对于非常大的向量,它看起来较慢

#include <vector>
#include <iostream>
#include <set>

using namespace std;

class Solution {
public:
int removeDuplicates(vector<int>& nums) {
  auto iter = nums.begin();
  while(iter!=nums.end())
  {
      if((!((iter+1) == nums.end())) && 
         (*iter == *(iter+1)))
      {
          iter = nums.erase(iter);
      }
      else
          iter++;
  }
  return nums.size();
}
};

template<typename T>
size_t RemoveDuplicatesKeepOrder(std::vector<T>& vec)
{
    std::set<T> seen;

    auto newEnd = std::remove_if(vec.begin(), vec.end(), [&seen](const T& value)
    {
        if (seen.find(value) != std::end(seen))
            return true;

        seen.insert(value);
        return false;
    });

    vec.erase(newEnd, vec.end());

    return vec.size();
}

int main()
{
  std::vector<int> v{1,1,2,2,3,4,5,5,6,6,6,6};
  Solution s;
  s.removeDuplicates(v);
  for(auto const &element:v)
     std::cout << element << std::endl;
  std::vector<int> v1{1,1,2,2,3,4,5,5,6,6,6,6};
  RemoveDuplicatesKeepOrder(v1);
  for(auto const &element:v1)
     std::cout << element << std::endl;
}
#包括
#包括
#包括
使用名称空间std;
类解决方案{
公众:
int-removeDuplicates(向量和nums){
auto iter=nums.begin();
while(iter!=nums.end())
{
如果(!((iter+1)=nums.end())&&
(*iter==*(iter+1)))
{
iter=数值擦除(iter);
}
其他的
iter++;
}
返回nums.size();
}
};
模板
大小\u t RemovedUpplicateSeOrder(标准::向量和向量)
{
std::集看见;
auto newEnd=std::remove_if(vec.begin(),vec.end(),[&seen](常量T&value)
{
if(seen.find(value)!=std::end(seen))
返回true;
见。插入(价值);
返回false;
});
向量擦除(newEnd,vec.end());
返回向量大小();
}
int main()
{
向量v{1,1,2,2,3,4,5,5,6,6,6};
溶液s;
s、 移除的副本(v);
用于(自动常量和元素:v)

std::当在容器上迭代时删除元素时,您是否必须小心。这里的示例应该为您提供适当的代码:我们需要重复的定义(连续重复或在任何地方重复)以及是否必须保留顺序以提供合理的解决方案。
if(*iter==*(iter+1))
在最后一个元素没有定义,因为
*(iter+1)
试图取消引用
end()
;@user4581301 yea也注意到了这一点。但我认为这段代码不足以删除重复。(0,1,1,0)对于exsmple。我相信它需要循环两次。根据重复的定义,两次也不够:0,1,1,0->0,1,0。