3 回答

TA貢獻1886條經驗 獲得超2個贊
可以使用雙重循環,逐一對比元素,如有重復,則刪除的方法去重。
其思路為
1、依次遍歷循環中的每一個元素。
2、對于任意一個元素,依次與之前的元素進行對比,如果有重復則刪除。
3、刪除操作可以采用將后續元素逐個前移,達到覆蓋當前元素的效果。
在此基礎上可以進行一點優化,即,不需要每次刪除元素均前移所有元素,而是把需要保留的元素放到"應該"放的位置即可,這樣可以提高效率。
以整型數組為例,參考代碼如下:
1234567891011121314 | int remove_repeat( int *a, int l) //對起始地址為a,長度為l的數組進行去重,新的長度以返回值形式返回。 { int i,j, r=0; //i,j為循環下標,r為去重后元素總數,初始值為0 for (i = 0; i < l; i ++) { for (j = 0; j < r; j ++) //檢查是否重復 if (a[j] == a[i]) break ; if (j == r) //沒有重復元素 a[r++] = a[i]; //將當前元素放置與去重后數組的尾部,并增加去重后的總數。 } return r; //返回新的長度。 } |

TA貢獻1824條經驗 獲得超8個贊
如果是使用STL的話,可以參考如下代碼:
123456789101112131415161718192021222324252627282930313233 | #include <vector> #include <iostream> #include <algorithm> using namespace std; int main() { vector< int > buf(5, 2); for ( int i = 0; i < 5; i++) buf.push_back( rand ()); // 上面一段是為了生成測試數據 // vector<int>::iterator 這個是定義了個迭代器 vector< int >::iterator it; // 輸出去重之前的元素 for (it = buf.begin(); it != buf.end(); it++) cout << *it << " " ; cout << endl; // 先對數據進行排序(必須的) sort(buf.begin(), buf.end()); // unique()函數就是去重用的 // 去重原理:找到重復的數據后移動到最后,然后返回第一個重復的元素的地址 it = unique(buf.begin(), buf.end()); // 刪掉重復的元素 buf.erase(it, buf.end()); // 輸出去重后的元素 for (it = buf.begin(); it != buf.end(); it++) cout << *it << " " ; cout << endl; } // 以上就是利用STL的方法 |
如果不是使用STL的話,只是對某個數組進行去重的話,可以參考這個過程:
1、進行排序(依然可以調用sort())
2、對比相鄰兩個元素,相同就刪掉一個

TA貢獻1847條經驗 獲得超7個贊
可以使用雙重循環,逐一對比元素,如有重復,則刪除的方法去重。
其思路為
1、依次遍歷循環中的每一個元素。
2、對于任意一個元素,依次與之前的元素進行對比,如果有重復則刪除。
3、刪除操作可以采用將后續元素逐個前移,達到覆蓋當前元素的效果。
在此基礎上可以進行一點優化,即,不需要每次刪除元素均前移所有元素,而是把需要保留的元素放到"應該"放的位置即可,這樣可以提高效率。
以整型數組為例,參考代碼如下:
1234567891011121314
int remove_repeat(int *a, int l)//對起始地址為a,長度為l的數組進行去重,新的長度以返回值形式返回。{ int i,j, r=0; //i,j為循環下標,r為去重后元素總數,初始值為0 for(i = 0; i < l; i ++) { for(j = 0; j < r; j ++)//檢查是否重復 if(a[j] == a[i]) break; if(j == r) //沒有重復元素 a[r++] = a[i]; //將當前元素放置與去重后數組的尾部,并增加去重后的總數。 } return r; //返回新的長度。}
- 3 回答
- 0 關注
- 4547 瀏覽
添加回答
舉報