C++ LeetCode删除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();
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。