C++ 在不使用任何STL容器的情况下删除重复项

C++ 在不使用任何STL容器的情况下删除重复项,c++,algorithm,C++,Algorithm,在30分钟的采访中,我被问到以下问题: 给定一个整数数组,在不使用任何STL容器的情况下删除重复项。例如: 对于输入阵列[1,2,3,4,5,3,3,5,4]输出应为: [1,2,3,4,5] 请注意,已包括第一个3、4和5,但由于已在输出数组中包含一次,因此已删除了后续的3。如果不使用额外的STL容器,我们该怎么办 在采访中,我假设我们只有正整数,并建议使用位数组标记输入中的每个元素(假设输入数组中的每个元素都是位数组的索引,并将其更新为1)。最后,我们可以迭代这个位向量,填充(或显示)唯一的

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

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

请注意,已包括第一个
3
4
5
,但由于已在输出数组中包含一次,因此已删除了后续的
3
。如果不使用额外的STL容器,我们该怎么办

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

谢谢。

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

另见

编辑:这是假设您在中获得一个std::vector,但它也适用于C样式数组,您只需自己实现擦除。

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


我们可以首先对数组进行排序,然后检查下一个元素是否与上一个元素相等,最后在另一个比上一个数组大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];
}
intarr1[]={1,2,3,4,5,3,3,5,4};
int arr2[]={0,0,0,0,0,0,0,0,0,0};
std::sort(std::begin(arr1),std::end(arr1));
int位置=1;
arr2[0]=arr1[0];
for(int*i=begin(arr1)+1;i!=end(arr1);i++){
如果((*i)!=(*(i-1))){
arr2[位置]=(*i);
位置++;
}
}
int size=0;
for(int*i=begin(arr2);i!=end(arr2);i++){
如果((*i)!=(*(i+1))){
大小++;
}
否则{
打破
}
}
int ans[尺寸];

对于(int i=0;iOW..为什么
-1
?如果没有时间复杂度要求,那么您只需迭代输出数组以查看是否已经有值。几乎所有
中的函数都可以使用C样式的数组。就我个人而言,我会选择标准解决方案,而不是任何其他解决方案,即使只是为了提高效率可以理解的代码。@RakeshKarandikar然后使用
std::sort
std::unique
结束story@user4581301OP没有说没有STL,他说没有STL容器什么是
Vec
v.erase(它结束,结束(v))
与c样式的数组一起工作?OP还说他们不能使用标准容器,所以他们不会得到或使用
std::vector
@NathanOliver我说他们需要自己实现擦除。OP想要什么,新分配的c数组?@NeilButterworth
Vec
vector
的类型定义。如果你无法使用向量,该算法仍然有效。迭代原始数组并删除任何重复项。对于实现标准库的主要部分的任何内容,该算法仍然有效-向量的接口,即它是向量,在OP的问题中被排除。我同意这是有效的(我会接受的,因为我的问题只是这个).但出于好奇,您如何修改它以确保它在
字符串
用户定义对象数组
中运行良好?我只是好奇。我同意我当前的问题没有提到这一点……我只是在寻找一种健壮的方法。首先,我知道我必须使用模板…@Rakesh模板与此无关尼尔·巴特沃斯,你能详细说明一下吗?我如何制作一个方法,它可以接受任何东西——整数数组、字符串或用户定义的对象作为输入?关于面试官想要的东西有很多假设。只要把一切都给他们。对他们排序,对他们进行散列,为他们实现模板,跳一支舞如果面试官关心效率,他/她应该取消愚蠢的限制。而暴力O(n^2)绝对不是最糟糕的
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) );
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];
}