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();
}
};
答案 0 :(得分:1)
您在循环中将迭代次数增加了两次。
low = 1
high = 10
l = [*range(low, high + 1)]
for i in l:
if i == 1:
print('{} is not a valid start number'.format(i))
continue
check = [i % n for n in [*range(2, i)]]
if all(check):
print('{} is a prime number'.format(i))
else:
print('{} is not a valid prime number'.format(i))
for idx, item in enumerate(check, start = 2):
if not item:
print('\t{} * {} = {} '.format(idx, int(i/idx), i))
if语句中的那个导致iter超出范围。 无需在if语句中增加迭代次数。
编辑:最好提一下,擦除向量会使迭代器无效。因此,仅删除重复的增量是不够的。这里有一些更多的信息。 how to erase from vector in range-based loop?
最后,这种迭代还不足以消除散布在向量周围的重复数字,例如1 is not a valid start number
2 is a prime number
3 is a prime number
4 is not a valid prime number
2 * 2 = 4
5 is a prime number
6 is not a valid prime number
2 * 3 = 6
3 * 2 = 6
7 is a prime number
8 is not a valid prime number
2 * 4 = 8
4 * 2 = 8
9 is not a valid prime number
3 * 3 = 9
10 is not a valid prime number
2 * 5 = 10
5 * 2 = 10
,for(vector<int>::iterator iter = nums.begin();iter!=nums.end();iter++)
{
if(*iter == *(iter+1))
{
nums.erase(iter+1);
iter++
}
}
答案 1 :(得分:1)
迭代器将因调用擦除而失效。但是,擦除方法将返回一个新的迭代器。代码需要小心,不要越过带有iter + 1逻辑的最后一个元素。我已经在下面修复了您的代码。
我还使用了remove_if和一组包含了here中更现代的样式。它避免了一些迭代器的混乱。它也适用于未排序的向量。对于一个很大的向量,它似乎变慢了。
#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;
}
答案 2 :(得分:0)
您可以直接从测试用例的控制台/文件输入中删除重复项,而无需先将所有值存储在数组中。您可以使用std::unordered_set<int>
存储从cin读取的值。
像这样:
std::unordered_set<int>arr;
int test_cases;
cin>>test_cases;
while (test_cases--)
{
int x;
cin >> x;
arr.insert(x);
}