这是一个LeetCode的简单题,在二刷做过的题时突然感觉这个题真的是非常的不错,虽然是个简单题,没有什么技巧,但是写代码的过程中有很多要注意的点,感觉还是很考验基本功,而且还加深了对数组的理解。
Java中的数组是存放一系列相同元素的集合,对应着堆空间中的连续的存储空间,所以在删除数组中某个元素的时候为保证数组的连续性,需要将后面的元素逐一向前覆盖,这就是这个题的解题思路。代码如下:
public static void main(String[] args) {
int[] nums = {2, 3, 3, 2};
int target = 3;
//首先遍历数组找target
int len = nums.length;
int i = 0;
while (i < len) {
if (nums[i] == target) {//这时就需要删除该元素了,需要将后面的元素逐步向前覆盖
for (int j = i; j < len - 1; j++) {
nums[j] = nums[j + 1];
}
i--;//需要将指针后移一位,因为此时i的位置上是原来i+1处的元
//素,不后移会跳过该元素的处理
len--;//因为删除了一个元素所以需要len--
}
i++;
}
System.out.println(Arrays.toString(nums));//输出{2, 2, 2, 2}
}
代码中两个for循环其实还可以用双指针来代替,这样时间复杂度更低,代码如下,思想比较简单,其实就是对数组进行重排,然后移除掉我们要删除的,把留下来的元素从数组头开始放,所以用一个i指针来记录了我们下一个要放的元素的位置,这种思想在很多地方都有应用,比如排序算法。
public int removeElement(int[] nums, int val) {
int len = nums.length;
int i = 0;
int j = 0;
while (i < len && j < len) {
if (nums[j] != val) {
nums[i] = nums[j];
i++;
}
j++;
}
return i;
}