精华内容
下载资源
问答
  • 删除排序数组中的重复项 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组新长度。 不要使用额外数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间...

    原文地址:https://www.namidame.tech/delete-duplicated-item.html

    1. 问题描述

    删除排序数组中的重复项
    给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

    不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

    示例 1:
    给定数组 nums = [1,1,2],
    函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。
    你不需要考虑数组中超出新长度后面的元素。

    示例 2:
    给定 nums = [0,0,1,1,1,2,2,3,3,4],
    函数应该返回新的长度 5, 并且原数组 nums 的前五个元素被修改为 0, 1, 2, 3, 4。
    你不需要考虑数组中超出新长度后面的元素。

    说明:
    为什么返回数值是整数,但输出的答案是数组呢?
    请注意,输入数组是以「引用」方式传递的,这意味着在函数里修改输入数组对于调用者是可见的。

    你可以想象内部操作如下:

    // nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
    int len = removeDuplicates(nums);
    
    // 在函数里修改输入数组对于调用者是可见的。
    // 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
    
    for (int i = 0; i < len; i++) {
        print(nums[i]);
    }
    

    作者:力扣 (LeetCode)
    链接:https://leetcode-cn.com/leetbook/read/top-interview-questions-easy/x2gy9m/

    2. 时间复杂度o(n^2)的方法

    可以按照最傻瓜的思路来解决,就是定义两个指针,用嵌套的两个循环分别遍历整个数组,这样的话两个循环执行的数量级都是n,所以时间复杂度是o(n^2)。下面给出代码实现

    #include<iostream>
    #include<vector>
    using namespace std;
    int removeDuplicates(vector<int>& nums) {
        if(nums.size() == 0 || nums.size() == 1)
        {
            return nums.size();
        }
        for(vector<int>::iterator it = nums.begin(); it != nums.end(); ++it){
            vector<int>::iterator start = nums.end(), end = nums.end();
            for(auto it2 = it + 1; it2 != nums.end(); ++it2){
                if(it2 != nums.end()){
                    if(*it2 == *it && start == nums.end()){
                        start = it2;
                    }
                    if(*it2 != *it)
                    {
                        end = it2;
                        break;
                    }
                    if(start != nums.end() && it2 + 1 == nums.end())
                    {
                        end = it2 + 1;
                        break;
                    }                
                }
            }
            if(start != nums.end()){
                nums.erase(start, end);
            }
        }
        return nums.size();
    }
    
    int main()
    {
        int a[10] = {0,0,1,1,1,2,2,3,3,4};
        vector<int>nums(a, a+10);
        // nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
        int len = removeDuplicates(nums);
        // 在函数里修改输入数组对于调用者是可见的。
        // 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
        for (int i = 0; i < len; i++) {
            cout << nums[i] << " "; // 0 1 2 3 4
        }
        cout << endl;
    }
    

    3. 时间复杂度o(n)的方法

    注意题目描述,给定的数组已经是排好序的数组,如果第1个指针总是遍历每一项,那么如果数组中有很多相同的项,中间的遍历其实都是不需要的,我们可以找出相邻不相同的位置作为边界,直接把下一个不相同的值移动到数组前面,最后返回数组前面的所有不同项即可。可以定义两个指针指向相邻的两项,同时向后移动两个指针并对比值是否相同,若不同则把值放到数组前方当前索引处,并将当前放置位置的索引后移一位,最后将vector重置大小至放置索引即可。因为两个指针是同时移动的,只需移动n-1次即可遍历完整个数组并完成数组的更新,所以算法的时间复杂度是o(n)。这种方法称为双指针法。

    #include<iostream>
    #include<vector>
    using namespace std;
    int removeDuplicates(vector<int>& nums) {
        if(nums.size() == 0 || nums.size() == 1)
        {
            return nums.size();
        }
    
        int pre = 0, next = 1;
        int curPutPos = 1;
        while(next < nums.size())
        {
            if(nums[pre] != nums[next])
            {
                if(nums[curPutPos] != nums[next])
                {
                    nums[curPutPos] = nums[next];
                }
                ++curPutPos;
            }
            ++pre;
            ++next;
        }
        nums.resize(curPutPos);
        return nums.size();
    }
    
    int main()
    {
        int a[10] = {0,0,1,1,1,2,2,3,3,4};
        vector<int>nums(a, a+10);
        // nums 是以“引用”方式传递的。也就是说,不对实参做任何拷贝
        int len = removeDuplicates(nums);
        // 在函数里修改输入数组对于调用者是可见的。
        // 根据你的函数返回的长度, 它会打印出数组中该长度范围内的所有元素。
        for (int i = 0; i < len; i++) {
            cout << nums[i] << " "; // 0 1 2 3 4
        }
        cout << endl;
    }
    

    著作权归作者所有。
    商业转载请联系作者获得授权,非商业转载请注明出处。
    作者: 你很德布罗意
    邮箱: namidame@sina.cn
    博客地址: https://www.namidame.tech/
    原文地址: http://www.namidame.tech/delete-duplicated-item.html

    展开全文
  • 前几天做了一下阿里巴巴春季面试题,其中有一道是:编写一个函数,传入一个数组,如果有相同的元素删除元素。返回数组 思考了一下,我步骤很简单 (1)先把数组排序。 (2)如果第i个和i+1个相同,则删掉其中...

    我现在大三。前几天做了一下阿里巴巴春季面试题,其中有一道是:编写一个函数,传入一个数组,如果有相同的元素,删除元素。返回数组

    思考了一下,我的步骤很简单

    (1)先把数组排序。

    (2)如果第i个和i+1个相同,则删掉其中一个元素就可以了

    先贴代码如下:

    function delRepeat(arr){
      arr.sort(function(a,b){
        return a>b? 1:-1;
      });


      for(var i = 0;i<arr.length;i++){
        if(arr[i] === arr[i+1]){
          arr.splice(i,1);
        }
      }
      return arr;
    }

    分析:利用数组方法 sort().但是sort()方法不能准确按照数字大小返回,因为这个方法是按照字典序排列。所以return a>b? 1:-1;这一句来保证数组从小到大排列。

      接下来判断如果第i个和i+1个相同,则用数组的splice()方法。第一个参数是删除元素的开始位置,第二个参数是删除的个数。(返回一个包含被移除元素的数组)。

      好了,这样就简单实现了。

     

     

    示例:       var arr = [1,23,4,32,4];

    浏览器返回:  delRepeat(arr);

            [1, 4, 23, 32]

     

     

    问题:如果题目要求不能排序,怎么做我就没思路了…………

    转载于:https://www.cnblogs.com/yanpu/p/4557568.html

    展开全文
  • 写一个小程序时候,需要去除一个数组中的重复元素,搜索了一下,找到代码主要是两种,一种是使用grep函数,一种是转换为hash表,代码分别如下:使用grep函数代码片段:代码: my @array = ( 'a', 'b', 'c', ...

    写一个小程序时候,需要去除一个数组中的重复元素,搜索了一下,找到的代码主要是两种,一种是使用grep函数,一种是转换为hash表,代码分别如下:

    使用grep函数代码片段:
    代码:


    my @array = ( 'a', 'b', 'c', 'a', 'd', 1, 2, 5, 1, 5 );
    my %count;
    my @uniq_times = grep { ++$count{ $_ } < 2; } @array;



    使用转换hash代码片段:
    代码:


    my @array = ( 'a', 'b', 'c', 'a', 'd', 1, 2, 5, 1, 5 );
    my %saw;
    @saw{ @array } = ( );
    my @uniq_array = sort keys %saw;



    使用grep那种方法并不是很好懂,我尝试解释一下,未必说得清楚或者正确。其实就是把数组的每个元素作为一个hash表的key,++之后第一个元素出现的时候值就是1,如果第二次出现这个值就是2了。其实就是统计了数组每个元素的出现次数,少于2次的就放到新的数组当中。我写了个比较好懂的代码,和使用grep方法的代码原理大致相同,但是又不完全一样,代码如下:
    代码:


    my @array = ( 'a', 'b', 'c', 'a', 'd', 1, 2, 5, 1, 5 );
    my %count_hash;
    my @uniq_array;
    foreach my $value ( @array )
    {
      if( exists( $count_hash{ $value } ) )
      {
         next;
      }
      else
      {
        $count_hash{ $value } = 1;
        push( @uniq_array, $value );
      }
    }

     

    #!/usr/bin/perl
    
    use strict;
    
    my %hash;
    my @array = (1..10,5,20,2,3,4,5,5);
    #grep 保存符合条件的元素
    @array = grep { ++$hash{$_} < 2 } @array;
    
    print join(" ",@array);
    print "n";

     

    转载于:https://www.cnblogs.com/xufeiyang/p/3747617.html

    展开全文
  • 我们上一篇文章讲述了《如何删除PHP数组中头部,尾部,任意元素》,本文我们讲述通过 array_unique()函数删除数组中重复元素。 array_unique()函数,将数组元素的值作为字符串排序,然后对每个值只保留第一个键名,...
  • 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间条件下完成。示例 1:给定数...

    给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。

    不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。

    示例 1:

    给定数组 nums = [1,1,2], 
    函数应该返回新的长度 2, 并且原数组 nums 的前两个元素被修改为 1, 2。 
    你不需要考虑数组中超出新长度后面的元素。

    思路:把列表转为集合(集合中无重复元素),在转回列表

    class Solution(object):
        def removeDuplicates(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            nums[:] = list(sorted(set(nums)))
            return len(nums)

    值得注意的是,我们使用了sorted函数,原因是当以下示例出现时,没有sorted函数会出错。

    输入:[-1,0,0,0,0,3,3]

    预期结果:[-1,0,3]

    实际输出结果:[0,3,-1]

    这是由于python的集合的自动排序是正负数分开的,所以要用sorted排序。

    展开全文
  • 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间条件下完成。 示例1: 给定数...
  • 给定一个排序数组,你需要在 原地 删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间条件下完成。 示例 1: 给...
  • 删除排序数组中的重复项 II (点击查看题目)题目描述给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组新长度。不要使用额外数组空间,你必须在原地 修改输入数组 ...
  • array_unique()函数可以移除数组中重复的值,并返回结果数组;当几个数组元素的值相等时,只保留第一个元素,其他的元素被删除。 代码示例: <?php $result1 = array(a => green, red, b => green, blue, red)...
  • leetcode-删除数组中的重复元素 这是一道简单题,使用过双指针同学可以很快写出来 题目要求:删除数组中的重复元素,返回移除后数组新长度。并且修改数组,如给定 nums = [0,0,1,1,1,2,2,3,3,4],函数应该返回...
  • 我们原来利用vector中的sort和unique以及erase函数完成了对数组中的重复元素的删除操作,但是会sort改变了数组中本来的元素的顺序,想想这种办法总有自己的短处,就到处寻找可以在不改变元素的顺序的情况下,可以...
  • 题目描述给定一个已排序的数组,去除数组中重复元素,只保留一个重复的元素,并且返回新的数组长度。要求:不要给数组分配额外的空间,你必须使用常量的内存大小进行原地操作。例如:给出数组A=[1,1,2],你的函数...
  • 使用STL中的Unique函数: 1 #include<bits/stdc++.h> 2 using namespace std; 3 void fun(int &n) //配套for_each输出vector容器 4 { 5 cout<<n<<" "; 6 } 7 int main() 8 {...
  • 给定一个数组删除重复出现的元素,使得每个元素只出现一次,并返回数组的新长度。 * 注意:不要使用额外的数组空间,必须在原地修改输入数组,并在使用O(1)额外空间条件下完成 * 示例: * 给定数组nums = [0,0...
  • 删除排序数组中的重复项 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组新长度。 不要使用额外数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间条件...
  • 删除数组中重复的元素(Python)

    万次阅读 2018-06-26 14:31:39
    删除一个给定数组中重复的元素:1、可以利用set函数:num = [1,2,1,4,5] print(list(set(num)))2、使用字典函数:num = [1,2,1,4,5] b = {} c = b.fromkeys(num) #fromkeys(num)是用num中的元素作为键,并给每一个键...
  • VB 删除数组中的重复元素

    千次阅读 2013-02-14 19:43:27
    VB 删除数组中重复元素,当几个数组元素的值相等时,只保留第一个元素,其他的元素被删除。并且返回结果数组。以下这个函数只支持一维数组。 Function Array_unique(Arr As Variant) As Variant Arr = QuickSort...
  • array_unique() 函数移除数组中重复的值,并返回结果数组。当几个数组元素的值相等时,只保留第一个元素,其他的元素被删除
  • 数组去重方式有很多,我们可以使用 Set 去重、filter 过滤等,详见 携程&蘑菇街&bilibili:手写数组去重、扁平化...那么我们如何在不产生性数组情况下删除数组中的重复元素喃?方式一:排序去重MDN:so...
  • array_unique() 定义和用法 array_unique() 函数移除数组中重复的值,并返回结果数组。 当几个数组元素的值相等时,只保留第一个元素,其他的元素被删除。 返回的数组中键名不变。 语法 array_unique(array) 参数 ...
  • 题目描述:给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素最多出现两次,返回移除后数组的新长度。不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间条件下完成。示例 1...
  • 去除数组中重复元素, 找了下可以一下两个函数 php array_flip()与array_uniqure() $arr = array(…………) ;// 假设有数组包含一万个元素,里面有重复元素。 $arr = array_flip(array_flip($arr)); // 这样便...
  • 删除有序数组中重复出现的元素

    千次阅读 2016-04-15 14:12:00
    这是取自LeetCode一道题,题目大意是给你一个有序的数组,其中有些元素重复的,且最多出现两次,现在让你写一个函数,把这个数组重复的那些元素删除一个,留下一个,并返回新的元素个数。 那么这道题就很简单...
  • 26. 删除排序数组中的重复项 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组新长度。 不要使用额外数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间...
  • 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度。 不要使用额外的数组空间,你必须在原地修改输入数组并在使用 O(1) 额外空间条件下完成。 示例 1: ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,226
精华内容 890
关键字:

删除数组中重复元素的函数