【力扣刷题26】JS关于删除有序无序数组中的重复项的一些问题

题目(详见leetcode)

https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/

给你一个有序数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后的数组。

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

提示:

  • 0 <= nums.length <= 3 * 104
  • -104 <= nums[i] <= 104
  • nums 已按升序排列

这里利用快慢双指针解决这个问题

附上官方代码:

var removeDuplicates = function(nums) {
    const n = nums.length;
    if (n === 0) {
        return 0;
    }
    let fast = 1, slow = 1;
    while (fast < n) {
        if (nums[fast] !== nums[fast - 1]) {
            nums[slow] = nums[fast];
            ++slow;
        }
        ++fast;
    }
    return slow;
};

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/remove-duplicates-from-sorted-array/solution/shan-chu-pai-xu-shu-zu-zhong-de-zhong-fu-tudo/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

1.看到后我作为数据结构小白想到一个问题,为什么slow不从0开始?我看图解也没有看出所以然,然后我自己画了一个图,就明白了:

以上文中已经升序排列的数组为例子: 

1>当slow=0,fast=1时,根据if判断,arr中索引为1和0的元素值相等,arr[0]依旧为1,fast指向下一个位置

2>当slow=0,fast=2时,根据if判断,arr中索引为slow=0的元素被替换为arr[2]=2,这样这个数组索引为0的值就算没有重复也被删除了,不合理。

2.关于return

官方解题要求返回删除后的数组长度,遍历结束后,从arr[0]到arr[slow-1]的每个元素都不相同而且包含原数组中每个不同的元素,因此返回新的长度slow。

这里贴上一个我自己指定数组,删除重复项的方法:

1.首先数组没有升序排列,可以用数组排列对数组进行升序排列:

arr.sort(function(a, b){return a - b});

2.然后添加判断条件

3.裁剪(slice)或删除数组(splice)多余部分

代码实现:

<body>
    <p id="demo"></p>
    <script>
        //新建一个数组
        var arr = [1,2,3,2,1,3,4,2,5];
        //数组升序排列
        arr.sort(function(a, b){return a - b});

        var fast = 1,slow = 1;
        while( fast<arr.length ){
            if(arr[fast] != arr[fast-1]){
                arr[slow] = arr[fast] ;
                ++slow;
            }
            ++fast;
        }
        //slice裁剪
        var newArr = arr.slice(0,slow);
        document.getElementById("demo").innerHTML = newArr;
        //splice删除
        arr.splice(slow,arr.length);
        document.getElementById("demo").innerHTML = arr;
       // return slow;
    </script>
</body>

还有一种在初级学习JS时网课里老师讲的方法

不用先按顺序排列,冒泡排序

贴上代码:

<body>
    <p id="demo"></p>
    <script>
        //新建一个数组
        var arr = [1,2,3,2,2,1,3,4,2,5];
        //去除数组的重复数
        //获取数组中每一个元素
        for(var i=0 ; i<arr.length ; i++){
            //获取当前元素之后的所有数
            for(var j=i+1 ; j<arr.length ; j++){
                //判断两个值是否相等
                if(arr[i] == arr[j]){
                    //相等证明出现的重复的元素,则删除j对应的元素
                    arr.splice(j,1);
                    //当删除了当前j所在的元素以后,后面元素自动补位
                    //此时将不会再比较这个元素,需要再比较依次j所在位置的元素
                    //使j自减
                    j--;
                }
            }
        }
        document.getElementById("demo").innerHTML = arr;
    </script>
</body>

注意j--; 如果数组中有连续两个相同的元素,如果不添加j--,会重复出现相同的元素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值