我正在尝试hackerrank上的一种实践问题。
我知道有更好的方法可以做到,但是我想知道为什么这种方法无法更好地理解它。
矢量擦除功能似乎可以按预期运行,直到最后几次,然后以错误的索引擦除,即使没有任何变化。
调试器输出:
1,1,3,1,2,1,1,3,3,3,3,//向量中当前是什么
Delete indx 0&1 //我将擦除的第一对并增加计数
3,1,2,1,3,3,3,3,//继续...
删除indx 0和4
1,2,1,3,3,3,
删除indx 0和2
2,3,3,3,
Delete indx 1&2 //删除前三个和后三个
3、3 // //看起来像第0位,其他一些索引也被删除了
删除indx 0和1
返回的计数是:5
让我知道是否可以添加此问题以使其变得更好,谢谢
int i, count = 0;
for (i=0;i<ar.size()-1;i++)
{
for (int j=i+1;j<ar.size();j++)
{
if (ar[i] == ar[j])
{
ar.erase(ar.begin()+i-1);
ar.erase(ar.begin()+j-1);
count++;
i=-1;
break;
}
}
if (ar.size()== 0)
break;
}
答案 0 :(得分:0)
据我了解,您只需要成对计数(考虑清除)。
for(int i = 0; i < ar.size() - 1; i++){
for(int j = i + 1; j < ar.size(); j++){
if(ar[i] == ar[j]) {
ar.erase( ar.begin() + j );
count++;
break;
}
}
}
这样,您只需要执行1次擦除操作(这很慢,因为考虑到它会将已删除元素1插槽右侧的所有元素向左移动)。
如果向量很大,也请考虑不要一直使用ar.size()
(至少在j
循环中,因为在i
循环中这很重要)。尝试for(int j = i + 1, len = ar.size(); j < len; j++)
。