code第一部分数组:从有序数组中移除重复的数据

code第一部分数组:从有序数组中移除重复的数据

第二题 从有序数组中移除重复的数据,但是可以保留2个重复的数。
For example, Given sorted array A = [1,1,1,2,2,3],
Your function should return length = 5, and A is now [1,1,2,2,3]

解决方法1:和上面一题很类似,但是需要加上一个计数器;
解决方法2:可以使用条件语句来判断:i>0&&i<n-1&&a[i]==a[i-1]&&a[i]==a[i+1];

源代码如下

#include <iostream>
using namespace std;

int removeduplicate(int a[],int n)
{
    if (n==0)
    {
        return 0;
    }
    int count=1;
    int index=0;
    for (int i = 1; i < n; i++)
    {
        if (a[index]==a[i])
        {
            if (count<2)
            {
                index++;
                a[index]=a[i];
                count++;
            }
        }
        else
        {
            index++;
            a[index]=a[i];
            count=1;
        }
    }
    return index+1;
}


int removeduplicate2(int a[],int n)
{
    if (n==0)
    {
        return 0;
    }
    int index=0;
    int i;
    for (i = 0; i < n; i++)
    {
        if (i>0&&i<n-1&&a[i]==a[i-1]&&a[i]==a[i+1])
        {
            continue;
        }
        a[index]=a[i];
        index++;
    }
    return index;

}

拓展
从无序数组中移除重复的数据,但是可以保留2个重复的数。

分析,因为是无序的,如果没有时间复杂度的要求,可以先排序,比如快排O(nlogn)时间复杂度;
但是如果有要求,可以使用hashmap来记录出现的次数,时间复杂度为O(N),空间复杂度也为O(N);

解决方案1:先排序,再去重;
解决方案2:使用hash表;

方案一源代码
时间复杂度O(nlogn),空间复杂度O(1);

#include <iostream>
#include <algorithm>

using namespace std;

int removeduplicate(int a[],int n)
{
    sort(a,a+n);
    if (n==0)
    {
        return 0;
    }
    int count=1;
    int index=0;
    for (int i = 1; i < n; i++)
    {
        if (a[index]==a[i])
        {
            if (count<2)
            {
                index++;
                a[index]=a[i];
                count++;
            }
        }
        else
        {
            index++;
            a[index]=a[i];
            count=1;
        }
    }
    return index+1;
}


int removeduplicate2(int a[],int n)
{
    sort(a,a+n);
    if (n==0)
    {
        return 0;
    }
    int index=0;
    int i;
    for (i = 0; i < n; i++)
    {
        if (i>0&&i<n-1&&a[i]==a[i-1]&&a[i]==a[i+1])
        {
            continue;
        }
        a[index]=a[i];
        index++;
    }
    return index;

}



int main()
{
    int a[6]={1,2,1,2,1,3};
    int ans=removeduplicate(a,6);
    cout<<ans<<endl;
    int b[6]={1,2,1,2,1,3};
    int ans1=removeduplicate2(b,6);
    cout<<ans1<<endl;

    return 0;
}

方案2源代码

#include <iostream>

#include <map>
using namespace std;

/*typedef std::map<int,int> MAP;
MAP my_map;*/
map<int,int> my_map;
int removeduplicate(int a[],int n)
{

    int i;
    int index=0;
    for (i = 0; i < n; i++)
    {
        if (my_map[a[i]]<2)
        {
            my_map[a[i]]++;
            a[index++]=a[i];
        }
        else
            continue;
    }
    return index;
}

int main()
{
    int a[6]={1,2,1,2,1,3};
    int ans=removeduplicate(a,6);
    cout<<ans<<endl;
    return 0;
}

测试通过!

原文地址:https://www.cnblogs.com/tao-alex/p/6442982.html