Skip to content

编程题:不产生新数组,删除数组里的重复元素。 #17

Open

Description

@CodeRookie262

封装一个数组去重函数,不产生新数组,删除数组里的重复元素。

const removeDuplicate = function(nums){
    // show you code
    return nums;
}

let arr = [1,2,2,3];
let dupArray = removeDuplicate(arr)
console.log(dupArray,dupArray === arr); // [1,2,3]   true

Activity

  1. CodeRookie262 commented on Jan 8, 2021

    @CodeRookie262
    OwnerAuthor

    暴力破解版

    const removeDuplicate = function (nums) {
      // 获取数组的长度
      let len = nums.length - 1;
    
      for (var i = len; i >= 0; i--) {
        // 判断当前元素之前是否存在过,如果存在过则 将数组长度减 1,同时将数组的最后一位赋值给当前项
        if (nums.indexOf(nums[i]) !== i) {
          nums[i] = nums[len--];
        }
      }
    
      nums.splice(len + 1);
    
      return nums;
    };
  2. CodeRookie262 commented on Feb 1, 2021

    @CodeRookie262
    OwnerAuthor

    双指针法(快慢指针)

    const removeDuplicate = function (nums){
        if(!nums || nums.length === 0) return nums;
        let start = 0,
              index = 1;
        while(index < nums.length){
            if(nums[start] !== nums[index]){
                nums[start+1] = nums[index];
                start++;
            }
            index++;
        }
        nums.length = start + 1;
        return nums;
    }

    简化版

    var removeDuplicate = function(nums){
        if(!nums || nums.length === 0) return nums;
        let i = 0;
        for(var k = 1;k < nums.length;k++){
            if(nums[k] !== nums[k - 1]) nums[++i] = nums[k];
        }
    -    nums.length = i;
    +   nums.length = i + 1;
        return nums;
    }
  3. CodeRookie262 commented on Feb 1, 2021

    @CodeRookie262
    OwnerAuthor

    计数法

    var removeDuplicate = function (nums){
        let count = 0;
        if(!nums || nums.length === 0) return nums;
        
        for(var i = 1,l = nums.length;i < l;i++){
            if(nums[i] === nums[i - 1]) {
                count++;
            }else{
                nums[i - count] = nums[i];
            }
        }
    
        nums.length -= count;
    
        return nums;
    }
  4. yokuray commented on Feb 1, 2021

    @yokuray

    学废了学废了,但是我不会告诉你简化版有小问题🙈

  5. yokuray commented on Feb 1, 2021

    @yokuray

    复杂的我不懂,来个简单的(~ ̄▽ ̄)~

    var removeDuplicates = function (nums) {
        if (!nums) return nums; // 非有效数组直接返回本身
    
        // 当前值,参照值的索引
        let curVal = nums[nums.length - 1], preIdx;
        for (let i = nums.length - 1; i > 0; i--) {
            preIdx = i - 1; // 用当前元素的前一个元素作为参照值
    
            if (curVal === nums[preIdx]) {
                // 二者相等则将参照值切分出去,当前元素会自动向前补位
                nums.splice(preIdx, 1);
            } else curVal = nums[preIdx]; // 若不等则将当前值更新为参照值,进入下次循环,渐进比对
        }
    
        return nums;
    };
  6. CodeRookie262 commented on Feb 1, 2021

    @CodeRookie262
    OwnerAuthor

    学废了学废了,但是我不会告诉你简化版有小问题🙈

    发现了哈哈,你说的应该是nums.length = i,这个需要更改为 nums.length = i + 1;

  7. CodeRookie262 commented on Feb 1, 2021

    @CodeRookie262
    OwnerAuthor

    复杂的我不懂,来个简单的(~ ̄▽ ̄)~

    var removeDuplicates = function (nums) {
        if (!nums) return nums; // 非有效数组直接返回本身
    
        // 当前值,参照值的索引
        let curVal = nums[nums.length - 1], preIdx;
        for (let i = nums.length - 1; i > 0; i--) {
            preIdx = i - 1; // 用当前元素的前一个元素作为参照值
    
            if (curVal === nums[preIdx]) {
                // 二者相等则将参照值切分出去,当前元素会自动向前补位
                nums.splice(preIdx, 1);
            } else curVal = nums[preIdx]; // 若不等则将当前值更新为参照值,进入下次循环,渐进比对
        }
    
        return nums;
    };

    @Mirai39 👍👍
    这代码写的可以,反向遍历切掉重复的元素,解决了指向切割照成数组崩塌的问题,也是一种解决方法,Nice~
    不过读起来有点费劲😁😁

  8. CodeRookie262 commented on Feb 1, 2021

    @CodeRookie262
    OwnerAuthor

    复杂的我不懂,来个简单的(~ ̄▽ ̄)~

    var removeDuplicates = function (nums) {
        if (!nums) return nums; // 非有效数组直接返回本身
    
        // 当前值,参照值的索引
        let curVal = nums[nums.length - 1], preIdx;
        for (let i = nums.length - 1; i > 0; i--) {
            preIdx = i - 1; // 用当前元素的前一个元素作为参照值
    
            if (curVal === nums[preIdx]) {
                // 二者相等则将参照值切分出去,当前元素会自动向前补位
                nums.splice(preIdx, 1);
            } else curVal = nums[preIdx]; // 若不等则将当前值更新为参照值,进入下次循环,渐进比对
        }
    
        return nums;
    };

    @Mirai39 👍👍
    这代码写的可以,反向遍历切掉重复的元素,解决了指向切割照成数组崩塌的问题,也是一种解决方法,Nice~
    不过我感觉我读起来有点费劲┭┮﹏┭┮

  9. yokuray commented on Feb 1, 2021

    @yokuray

    不过我感觉我读起来有点费劲┭┮﹏┭┮

    哈哈哈~~我的错我的错,谢罪<( _ _ )>

  10. CodeRookie262 commented on Feb 1, 2021

    @CodeRookie262
    OwnerAuthor

    不会呀,这个方法我真的没有想到,多亏你让我学到了新的解法 o( ̄▽ ̄)d good

  11. yokuray commented on Feb 1, 2021

    @yokuray

    不会呀,这个方法我真的没有想到,多亏你让我学到了新的解法 o( ̄▽ ̄)d good

    握爪~~

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions