在30分钟的采访中,我被问到以下问题:
给出一个整数数组,在不使用任何STL容器的情况下删除重复项。例如: 对于输入数组
[1,2,3,4,5,3,3,5,4]
,输出应为:[1,2,3,4,5]
;
请注意,已经包含了前3
,4
和5
,但是由于我们已经将它们一次包含在输出数组中,因此随后的那些已被删除。不使用额外的STL容器怎么办?
在采访中,我假设我们只有正整数,并建议使用位数组来标记输入中存在的每个元素(假设输入数组中的每个元素都作为位数组的索引,并将其更新为{ {1}})。最后,我们可以遍历此位向量,以填充(或显示)唯一元素。但是,他对这种方法不满意。我可以使用其他方法吗?
谢谢。
答案 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) );
答案 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>
编辑:这是假设您输入了std :: vector,但是它也可以用于C样式的数组,您只需要自己实现擦除即可。