【问题标题】:remove duplicates from sorted array, same solution with different code way has different output从排序数组中删除重复项,不同代码方式的相同解决方案具有不同的输出
【发布时间】:2020-01-27 12:44:55
【问题描述】:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
#include "hello_world.h"


using namespace std;


class Solution1 {
public:
    int removeDuplicates(vector<int>& nums) {
        return distance(nums.begin(), removeDuplicates(nums.begin(), nums.end(), nums.begin()));
    }
    template<typename InIt, typename OutIt>
    OutIt removeDuplicates(InIt begin, InIt end, OutIt output){
        while(begin != end){
            *output++ = *begin;
            begin = upper_bound(begin, end, *begin);
        }

        return output;
    }

};


class Solution2 {
public:
    int removeDuplicates(vector<int>& nums) {
        vector<int>::iterator output = nums.begin();
        while(nums.begin() != nums.end()){
            *output++ = *nums.begin();
            nums.begin() = upper_bound(nums.begin(), nums.end(), *nums.begin());
        }

        return distance(nums.begin(), output);
    }
};


int main()
{
    //helloworld test;
    //test.print();
    int num[3] = {1,1,2};
    vector<int> nums(num, num + 3);

    Solution2 so;
    int a = so.removeDuplicates(nums);
    cout<<a<<endl;


    return 0;
}

在 main 函数中,当我使用类 solution1 时,代码可以从数组 [1 1 2] 中删除重复的数字,以输出 [1 2]。为了简化代码,我把解决方案1改成了解决方案2,但是解决方案2不能正确输出,有人知道原因吗?

【问题讨论】:

  • 您显示的代码打印单个int,而不是向量的内容。同样,第一个和第二个变体实际上都没有从向量中删除任何东西。您要删除重复项还是计算它们?
  • 代码是删除重复并计算它们,我得到了正确的答案,感谢您的关注。

标签: c++ algorithm vector iterator unique


【解决方案1】:

在这个while循环中

    while(nums.begin() != nums.end()){
        *output++ = *nums.begin();
        nums.begin() = upper_bound(nums.begin(), nums.end(), *nums.begin());
    }

您总是在条件和此语句中使用迭代器 nums.begin()

        *output++ = *nums.begin();

因为这句话

        nums.begin() = upper_bound(nums.begin(), nums.end(), *nums.begin());

不会更改 nums.begin() 的新调用返回的迭代器。

需要在循环之前引入一个迭代器类型的变量

auto it = nums.begin();

while( it != nums.end()){
    *output++ = *it;
    it = upper_bound( it, nums.end(), *it );
}

这是一个演示程序

#include <iostream>
#include <vector>
#include <iterator>
#include <algorithm>

int main() 
{
    std::vector<int> v = { 1, 2 };

    size_t i = 0;

    while ( v.begin() != v.end() )
    {
        v.begin() = std::upper_bound( v.begin(), v.end(), *v.begin() );

        if ( ++i == 10 ) break;
    }

    std::cout << "i = " << i << '\n';

    i = 0;

    auto it = v.begin();

    while ( it != v.end() )
    {
        it = std::upper_bound( it, v.end(), *it );

        if ( ++i == 10 ) break;
    }

    std::cout << "i = " << i << '\n';

    return 0;
}

它的输出是

i = 10
i = 2

要在循环后删除重复项,请使用成员函数 erase like

nums.erase( output, nums.end() );

使用标准算法std::unique 也可以做到这一点。例如

nums.erase( std::unique( nums.begin(), nums.end() ), nums.end() );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-28
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多