无需使用任何STL容器即可删除重复项

时间:2018-06-22 19:25:16

标签: c++ algorithm

在30分钟的采访中,我被问到以下问题:

  

给出一个整数数组,在不使用任何STL容器的情况下删除重复项。例如:   对于输入数组[1,2,3,4,5,3,3,5,4],输出应为:   [1,2,3,4,5];

请注意,已经包含了前345,但是由于我们已经将它们一次包含在输出数组中,因此随后的那些已被删除。不使用额外的STL容器怎么办?

在采访中,我假设我们只有正整数,并建议使用位数组来标记输入中存在的每个元素(假设输入数组中的每个元素都作为位数组的索引,并将其更新为{ {1}})。最后,我们可以遍历此位向量,以填充(或显示)唯一元素。但是,他对这种方法不满意。我可以使用其他方法吗?

谢谢。

3 个答案:

答案 0 :(得分:3)

只需使用std::sort()std::unique()

int arr[] = { 1,2,3,4,5,3,3,5,4 };
std::sort( std::begin(arr), std::end(arr) );
auto end = std::unique( std::begin(arr), std::end(arr) );

Live example

答案 1 :(得分:1)

我们首先可以对数组进行排序,然后检查下一个元素是否等于上一个元素,最后在另一个大小比上一个大2的数组的帮助下给出答案。

使用第二个数组初始化的值初始化第二个数组(第一个数组大于/小于给定的限制),为简单起见,假设为0

int arr1[] = { 1,2,3,4,5,3,3,5,4 };
int arr2[] = { 0,0,0,0,0,0,0,0,0,0,0 }; 
std::sort( std::begin(arr1), std::end(arr1) );
int position=1;
arr2[0] = arr1[0];
for(int* i=begin(arr1)+1;i!=end(arr1);i++){
     if((*i)!=(*(i-1))){
         arr2[position] = (*i);
         position++;
     }
}
int size = 0;
for(int* i=begin(arr2);i!=end(arr2);i++){
    if((*i)!=(*(i+1))){
        size++;
    }
    else{
        break;
    }
}
int ans[size];
for(int i=0;i<size;i++){
    ans[i]=arr2[i];
}

答案 2 :(得分:-2)

O(n ^ 2)中的简单算法:

<div id="imagens" class="tab-pane">
    @await Component.InvokeAsync("DropZone", new { codprod = Model.Cod.ToString() })
</div>

另请参阅erase-remove idiom

编辑:这是假设您输入了std :: vector,但是它也可以用于C样式的数组,您只需要自己实现擦除即可。