当我们需要删除有序数组中的重复元素时,有多种实现方法。这篇文章将比较三种不同的Java实现方法,并讲解其优缺点。三种方法分别是:
当我们需要删除有序数组中的重复元素时,有多种实现方法。这篇文章将比较三种不同的Java实现方法,并讲解其优缺点。三种方法分别是:
1.利用Java自带的ArrayList类
2.使用Java的双指针方法
3.使用一个计数器来记录重复元素
使用Java自带的ArrayList类
使用Java自带的ArrayList类来实现删除有序数组中重复元素的方法非常简单。具体实现方法如下:
public int removeDuplicates(int[] nums) {
List<Integer> list = new ArrayList<>();
for (int i = 0; i < nums.length; i++) {
if (!list.contains(nums[i])) {
list.add(nums[i]);
}
}
for (int i = 0; i < list.size(); i++) {
nums[i] = list.get(i);
}
return list.size();
}
在这种方法中,我们使用了Java自带的ArrayList类来存储唯一的元素。我们首先循环遍历整个有序数组,将元素存储到ArrayList中,只有在ArrayList中不存在该元素时才将该元素添加到ArrayList中。
然后,我们再次循环遍历ArrayList,将元素存储回输入的有序数组中。
这种方法的优点在于简单易懂,适用于任何的有序数组。但是,它需要使用额外的空间,因为它要使用一个ArrayList来存储唯一的元素,有可能会降低程序的效率。
使用Java的双指针方法
使用Java的双指针方法来实现删除有序数组中重复元素的方法也非常简单。具体实现方法如下:
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;
}
在这个双指针方法中,我们定义了两个指针i和j,从左到右遍历整个有序数组。除了第一个元素外,我们从下标为1的位置开始遍历输入数组。使用指针i来指向最后一个不重复的元素,而使用指针j来遍历整个数组,和指针i所指向的元素进行比较。
如果元素相同,就将指针j向后移动一位。如果元素不同,等同于发现了一个新的元素,就把指针i变为指向的元素的位置,同时把该新元素存储到i指针后面的元素位置上。
这种实现方法的优点在于只需使用了输入数组的额外空间,因为在遍历有序数组时只更新元素即可。是一种效率较高的实现方法。
使用一个计数器来记录重复元素
另一种实现方法是使用一个计数器,该计数器用于记录有多少个重复的元素。具体实现方法可参考下面的代码:
public int removeDuplicates(int[] nums) {
if (nums.length == 0) {
return 0;
}
int count = 0;
for (int i = 1; i < nums.length; i++) {
if (nums[i] == nums[i - 1]) {
count++;
} else {
nums[i - count] = nums[i];
}
}
return nums.length - count;
}
这个实现方法中,我们同样遍历整个有序数组,但是使用的是一个计数器来记录重复元素的个数。当遇到重复元素时,计数器增加1;否则,我们覆盖原有的元素,并将计数器重置为0.
这种实现方法的优点在于它的运行时间与输入数组的长度成正比关系,是一种效率较高的实现方法,而且只需使用输入数组的额外空间。
示例说明
假设输入有序数组为[1,1,2,2,3,4,5,5],那么按照上述三种实现方法的代码,删除重复元素后的输出数组应该为[1,2,3,4,5]。
下面给出这个样例的每种实现方法的输出结果,以便说明它们的工作方式:
1.利用Java自带的ArrayList类
输出结果:[1,2,3,4,5]
2.使用Java的双指针方法
输出结果:[1,2,3,4,5]
3.使用一个计数器来记录重复元素
输出结果:[1,2,3,4,5]
综上所述,每种实现方法的输出结果都是正确的,可以在不同情况下灵活使用。
本文标题为:Java实现删除排序数组中重复元素的方法小结【三种方法比较】
基础教程推荐
- Spring Security认证器实现过程详解 2023-01-29
- SpringBoot整合SpringSecurity实现JWT认证的项目实践 2023-03-21
- springboot jpa 实现返回结果自定义查询 2022-10-24
- 巧用Spring中的@Order进行排序 2023-04-17
- 安装 Java 开发工具包JDK(Windows版本) 2023-09-01
- Java多线程案例之单例模式懒汉+饿汉+枚举 2022-11-29
- springboot项目启动后执行方法的三种方式 2023-01-12
- Spring配置与依赖注入基础详解 2023-04-06
- Java详细分析LCN框架分布式事务 2023-03-22
- Java中实现String字符串用逗号隔开 2023-02-10