LeetCode删除C ++中的重复项

时间:2018-10-01 22:33:08

标签: c++

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();
}
};

3 个答案:

答案 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);
}