算法面试题 双指针算法

238 阅读1分钟

看下下面这道题

public class ArithmeticTest {
    /**
     * 一个有序数组,在不使用额外空间的情况下,删除数组中的重复项,返回新数组的长度
     * 
     * 例 [0,1,2,3,3,4,4,5,6,7,7,8]  返回 8
     */
    public static void main(String[] args) {

        

    }
}

肯定有人说了,这很简单啊,遍历一下,发现重复的直接删除就好了,这就涉及到了Java 数组的底层机制,实际上数组是没有删除功能的,代码中想要删除只能创建一个新数组,进行元素的迁移,但是上面的要求是不能使用额外的空间,所以这个方法是行不通的,解题可以通过双指针算法,先看图解,再看代码.

image.png

编码如下

public class ArithmeticTest {
    /**
     * 一个有序数组,在不使用额外空间的情况下,删除数组中的重复项,返回新数组的长度
     * <p>
     * 例 [0,1,2,3,3,4,4,5,6,7,7,8]  返回8
     */
    public static void main(String[] args) {
        int[] nums = new int[]{0, 1, 2, 3, 3, 4, 4, 5, 6, 7, 7, 8};
        int length = removeDuplicate(nums);
        System.out.println("新数组长度:" + length);
    }

    private static int removeDuplicate(int[] nums) {
        //判空
        if (nums.length == 0) {
            return 0;
        }
        //指针A
        int a = 0;
        //指针B
        for (int b = 1; b < nums.length; b++) {
            //判断B和A 是否相等
            if (nums[b] != nums[a]) {
                //赋值给a+1
                a++;
                nums[a] = nums[b];
            }
        }
        return a;
    }


}