这个题目比较简单就是找到相邻重复的下一个元素的位置,将其复制到前一个重复元素的第二个位置,以此类推,最后后面的那些元素已经废了,返回去重过后的数组的长度。以下是三个版本的去重函数,更多解答参考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;
}