首页 > 解决方案 > 更改/切换数组中的元素是否可以删除java中的元素(不是关于创建新对象或使用arraylist)?

问题描述

我正在尝试从 Leetcode 解决一个问题,但无法弄清楚如何解决它。我查找了解决方案,但我无法理解切换元素如何更改数组。

“给定一个排序数组 nums,就地删除重复项,使每个元素只出现一次并返回新的长度。

不要为另一个数组分配额外的空间,您必须通过使用 O(1) 额外内存就地修改输入数组来做到这一点。”

问题是关于删除重复元素,我必须修改作为参数传递的数组,这意味着我无法创建新对象。

public int removeDuplicates(int[] nums) {
    if (nums.length == 0) return 0;
    int i = 0;
    for (int j = 1; j < nums.length; j++) {
        if (nums[j] != nums[i]) {
            i++;
            nums[i] = nums[j];
        }
    }
    return i + 1;
}

这就是解决方案所说的,我无法理解 nums[i] = nums[j] 如何减少数组的大小。

标签: javaarrays

解决方案


你有正确的解决方案。客户端代码可能如下所示:

int[] nums = { 1, 2, 2, 3, 3, 3, 4, 4, 4, 4 };
int length = removeDuplicates(nums);
// nums = { 1, 2, 3, 4, 3, 3, 4, 4, 4, 4 } <- look! we have lost 2 and have five 4!

System.out.println("Actual length of array: " + nums.length);   // 10
System.out.println("Total unique numbers: " + length);          // 4

System.out.print("Unique numbers:");

for (int i = 0; i < length; i++)
    System.out.print(" " + nums[i]);

System.out.println();
System.out.print("The rest of array: ");

for (int i = length; i < nums.length; i++)
    System.out.print(" " + nums[i]);

如您所见,数组是相同的,您无法更改它的大小。但是您可以将所有唯一元素移动到数组的开头并检索新的长度给客户端(即只有第一个length元素是正确的并且不关心其他元素,它们可能是任何元素)。

演示:

Actual length of array: 10
Total unique numbers: 4
Unique numbers: 1 2 3 4
The rest of array:  3 3 4 4 4 4

PS你认为ArrayList实际上是如何工作的?

public class ArrayList<E> {

    Object[] elementData;
    int size;
}

推荐阅读