看下下面这道题
public class ArithmeticTest {
/**
* 一个有序数组,在不使用额外空间的情况下,删除数组中的重复项,返回新数组的长度
*
* 例 [0,1,2,3,3,4,4,5,6,7,7,8] 返回 8
*/
public static void main(String[] args) {
}
}
肯定有人说了,这很简单啊,遍历一下,发现重复的直接删除就好了,这就涉及到了Java 数组的底层机制,实际上数组是没有删除功能的,代码中想要删除只能创建一个新数组,进行元素的迁移,但是上面的要求是不能使用额外的空间,所以这个方法是行不通的,解题可以通过双指针算法,先看图解,再看代码.
编码如下
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;
}
}