zoukankan      html  css  js  c++  java
  • 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;
    }

    测试通过!

  • 相关阅读:
    GitHub 如何创建 Access Token
    Fact Table 数据表什么意思
    高基数数据特性是什么意思
    Edge 浏览器的隐藏 URL QR 生成器
    Apache Druid 安装的时候进行 Java 版本校验没有输出
    Apache Druid 简介
    如何在 Discourse 中批量移动主题到不同的分类中
    素材
    Drawable转bitmap
    Drawable与 Bitmap 转换总结
  • 原文地址:https://www.cnblogs.com/tao-alex/p/6442982.html
Copyright © 2011-2022 走看看