面试常见算法1:有序数组去重

本文介绍了一种使用双指针方法去除有序数组中的重复元素,并返回新数组长度的算法。该方法适用于对数组进行去重操作,有效提升数据处理效率。

【引言】     

      本题是面试中经常被问到的算法基础题,解决这类问题的方法也很多,常用的就是所谓的“双指针”方法。在遇到需要对数组或者链表中元素进行比较时,就可以利用两个指针遍历数组或者链表来达到目的。一般而言这两个指针可以在同一端做同向移动,也可以在两端做相向移动,不同问题中指针移动速度也不尽相同。

【解题思路】

      对于本题,由于给定的是一个有序数组,可以直接利用双指针来解决。方法如下:

      使用两个下标i和j,其中i用于记录去重后所得新数组最后一个元素的位置,j用于遍历整个数组,i和j同向移动,通过j移动来带动i的移动。在处理中,当遇到j和i所指向的元素值不同时,把j所指元素的值拷贝到新数组最后一个位置(i所在位置),然后将i向后移动一位。当遇到j和i所指的元素值相同时,不对i进行处理,只移动j,这样就能保证i遍历过得元素值各不相同。

【代码】

    // 有序数组去重,返回新数组长度
    int removeDuplicates(int A[]) {
        int i = 0;    // 第一个指针
        int j;        // 第二个指针
        int n = A.length;
        if (n <=1 ) return n;        
        // 遍历数组
        for (j = 1; j < n; j++) {
            if (A[j] != A[i]) { // 若两个指针所指元素不同,则i+1位置保存j所指元素的值
                A[++i] = A[j];
            }
        }        
        return i+1;    // 返回新数组的长度
    }


转载于:https://my.oschina.net/MIKEWOO/blog/646090

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值