这个题目比较简单就是找到相邻重复的下一个元素的位置,将其复制到前一个重复元素的第二个位置,以此类推,最后后面的那些元素已经废了,返回去重过后的数组的长度。以下是三个版本的去重函数,更多解答参考leetcode题解分享,很精简的解答,都是非常值得学习的代码。
/* 线性表题目主要考察线性表操作,如数组、单链表、双向链表 题目1、Remove duplicates from sorted array从有序数组中移除重复元素思路:因为是有序数组,因此重复元素相邻,指派一个守卫在第一次遇见某元素位置k处,若下一个元素重复,则游标++后移一位,若不相等,则将该元素放到守卫后面,将守卫后移一位,最后守卫的位置就是无重复元素数组的最后一位,因为c++从0快开始计数,因此该非重复数组的长度为守卫的位置+1。 */ #include <iostream> #include <cstdio> #include <cstdlib> #include <vector> #include <algorithm> using namespace std; int removeDuplicates1(vector<int>& arr) { if (arr.size() == 0) return 0; int index = 0; for (int i=1;i<arr.size();i++) { if (arr[index] != arr[i]) arr[++index]= arr[i]; } return index + 1; } int removeDuplicates2(vector<int>&arr) { return distance(arr.begin(), unique(arr.begin(), arr.end())); } template<typename In, typename Out> Out removeDuplicate(In start, In end, Out outPut) { while (start != end) { *outPut++ = *start; start = upper_bound(start, end, *start); } return outPut; } int removeDuplicates3(vector<int>&arr) { return distance(arr.begin(), removeDuplicate(arr.begin(),arr.end(),arr.begin())); } int main() { vector<int>arr; int data; char s; while (cin>>data) { arr.push_back(data); s = getchar(); if (s == '\n') break; } cout << removeDuplicates1(arr) << endl; cout << removeDuplicates2(arr) << endl; cout << removeDuplicates3(arr) << endl; system("pause"); return 0; }