Java实现删除排序数组中重复元素的方法小结【三种方法比较】
作者:PayneWoo 发布时间:2023-09-28 15:21:48
标签:Java,数组,重复元素
本文实例讲述了Java实现删除排序数组中重复元素的方法。分享给大家供大家参考,具体如下:
题目描述:
给定一个排序数组,在原数组中删除重复出现的数字,使得每个元素只出现一次,并且返回新的数组的长度。
不要使用额外的数组空间,必须在原地没有额外空间的条件下完成。
一:通过ArrayList解决
时间复杂度和空间复杂度都为O(n)
ArrayList<Integer> list = new ArrayList<Integer>();
// 去掉数组中重复的元素
public int removeTheagain01(int[] array) {
if (array == null || array.length == 0) {
return 0;
} else if (array.length == 1) {
return 1;
} else {
int i = 0;
int n = array.length - 1;
while (i <= n) {
if (i == n) {
list.add(array[i]);
i++;
} else {
int j = i + 1;
if (array[i] == array[j]) {
while (j <= n && array[i] == array[j]) {
j++;
}
}
list.add(array[i]);
i = j;
}
}
for (int k = 0; k < list.size(); k++) {
array[k] = list.get(k);
}
return list.size();
}
}
二:利用System.arraycopy()函数来复制数组
时间复杂度为O(n^2),空间复杂度为O(n)
public int removeTheagain02(int[] array) {
if (array == null || array.length == 0) {
return 0;
} else if (array.length == 1) {
return 1;
} else {
int end = array.length - 1;
for (int i = 0; i <= end; i++) {
if (i < end) {
int j = i + 1;
if (array[i] == array[j]) {
while (j <= end && array[i] == array[j]) {
j++;
}
}
System.arraycopy(array, j, array, i + 1, end - j + 1);
end -= j - i - 1;
}
}
return end + 1;
}
}
三:借助临时变量解决问题
时间复杂度O(N),空间复杂度O(1)
public int removeTheagain03(int[] array) {
if (array == null || array.length == 0) {
return 0;
} else if (array.length == 1) {
return 1;
} else {
int temp = array[0];
int len = 1;
for (int i = 1; i < array.length; i++) {
if (temp == array[i]) {
continue;
} else {
temp = array[i];
array[len] = array[i];
len++;
}
}
return len;
}
}
总结:
数组下标(指针)与临时变量,是解决数组相关面试题的两 * 宝**
PS:本站还有两款比较简单实用的在线文本去重复工具,推荐给大家使用:
在线去除重复项工具:
http://tools.jb51.net/code/quchong
在线文本去重复工具:
http://tools.jb51.net/aideddesign/txt_quchong
希望本文所述对大家java程序设计有所帮助。
来源:https://blog.csdn.net/wu2304211/article/details/52743589


猜你喜欢
- 使用adb or fastboot命令进入高通的9008(edl)模式已经有人写过了,下面两种是其中之一,我再加一个如题,两种方法1. ad
- 线程(Thread)是并发编程的基础,也是程序执行的最小单元,它依托进程而存在。一个进程中可以包含多个线程,多线程可以共享一块内存空间和一组
- Androidstudio音乐播放器,供大家参考,具体内容如下实现目的:利用广播在myapplication中原本button点我暂停按钮是
- 引言 在一些项目中或是一些特殊的业务场景中,需要用到显示系统的当前时间,以及一些
- java实现读取、删除文件夹下的文件package test.com;import java.io.File;import java.io.
- Dataway介绍Dataway 是基于 DataQL 服务聚合能力,为应用提供的一个接口配置工具。使得使用者无需开发任何代码就配置一个满足
- 这里使用的是dynamic-datasource-spring-boot-starter ,它是一个基于springboot的快速集成多数据
- ArrayList的构造方法(前置知识)可快速过一些基本成员变量:// 默认初始大小private static final int DEF
- 循环依赖所谓循环依赖就是多个Bean之间依赖关系形成一个闭环,例如A->B->C->...->A 这种情况,当然,最
- RTF文档即富文本格式(Rich Text Format)的文档。我们在处理文件时,遇到需要对文档格式进行转换时,可以将RTF转为其他格式,
- using (TransactionScope tr = new TransactionScope()) {  
- 1、官网概括引用官网说法:The Java Virtual Machine defines various run-time data ar
- /// <summary>/// 生成二维码/// </summary>/// <param name=&qu
- SpringBoot项目中新增脱敏功能项目背景目前正在开发一个SpringBoot项目,此项目有Web端和微信小程序端。web端提供给工作人
- 1、引出安卓初学者一般在写android Activity的时候总是会在onCreate方法中加上setContentView方法来加载la
- Scrollview标题栏滑动渐变仿京东样式(上滑显示下滑渐变消失)/** * @ClassName MyScrollView * @Aut
- 概述在平时开发过程中经常会碰到需要使用圆角button的情况,一般也会包括很多其他小功能,比如要在里面添加img,设置不同的圆角大小等。针对
- 1,实现效果 2,实现代码:【1】 shape_drawable.xml 
- 提示出现unresolved external symbol _main搜了下找了下原因如下在创建MFC项目时
- 并行和并发并行:多个CPU实例或是多台机器同时执行一段处理逻辑,是真正的同时。并发:一个CPU或一台机器,通过CPU调度算法,让用户看上去同