最多保留两个元素。
我的实现是用递归,当发现有第三个重复元素时,递归调用查找第一个不重复的元素,从这个元素开始如果发现第三个重复的元素,继续向后查找,剩余个数保存在传进的变量中,函数的返回值返回的就是上一个元素需要连接的索引。
比如数组:{1,1,1,2,2,2,2,3,3,4,5};
count记录重复次数。当count为3时,就找到了需要覆盖的地方。第一次找到的元素索引是2,值为1,向后查找第一个与1不同的元素,即3号元素,先予以保存索引,然后查找值为2的重复元素,当索引为5时,count为3,又继续向后查找,索引为7, 7后面没有最大重复3个的就开始返回。数组从{1,1,1,2,2,3,3,4,5}变成{1,1,2,2,3,3,4,5},如果不考虑递归本身的多余消耗,自以为这样比迭代向后查找每次要移动大量可能会被删除的元素要快。不知有没有更好?
代码补充:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | #include <iostream> using namespace std; int sort( int arr[], int l, int r, int *n ) { int tmp=l, tmp_s=l, i=l+1, count = 1; while ( i<=r && count<3 ){ if ( arr[i] == arr[tmp] ) ++count; else { count=1; tmp=i; if ( tmp_s == l ) tmp_s=i; } ++i; } if ( count==3 ){ --i; count = sort( arr, i, r, n ); if ( tmp_s == l ) tmp_s = i; while ( count<=r ) arr[i++] = arr[count++]; *n-=count-i; return tmp_s; } else { if ( tmp_s != l ) return tmp_s; else return r+1; } } int main() { int n[]{1,1,1,2,2,3,3,3,4,5,5,6,6,6,6,6,6,6,7,8}, num= sizeof (n)/ sizeof ( int ), total=num; sort(n, 0, num-1, &total ); num = total; cout<< "剩余" << num << "个: [ " ; for ( int i=0 ; i<num ; ++i ){ cout<<n[i]; if ( i!=num-1 ) cout<< ',' ; else cout<< " ]" <<endl; } if ( !num ) cout<< " ]" <<endl; } |
不太规范- -悠着点看
登录后可查看更多问答,登录/注册