/*
* ArrayUnique.java
* Version 1.0.0
* Created on 2017年12月16日
* Copyright ReYo.Cn
*/
package reyo.sdk.utils.test.array; /**
* <B>创 建 人:</B>AdministratorReyoAut <BR>
* <B>创建时间:</B>2017年12月16日 下午3:32:23<BR>
*
* @author ReYo
* @version 1.0
*/
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set; /**
* ArrayUniue 数组去重的问题
*
* @author wait
*
*/
public class ArrayUnique {
/**
* 方法1 就是申请一个和nums大小一样的数组tmpNums,
* 然后遍历nums中的元素,对每个元素判断是否在tmpNums出现过,
* 如果出现过,那么就不放到新数组里面,也就是不做处理;
* 如果没有出现过,那么就把它放到新的数组里面
* 这种方法数组原来的相对顺序可以保证
* 时间复杂度是n^2和空间复杂度是n
*
* @param nums 输入需要去重的数组
* @return 返回去重后数组的长度
*/
public static int unique1(int[] nums) {
if (nums.length == 0) {
return 0;
}
int[] tmpNums = new int[nums.length];
tmpNums[0] = nums[0];
int index = 1;
for (int i = 1, len = nums.length; i < len; i++) {
int j = 0;
for (; j < index; j++) {
if (tmpNums[j] == nums[i]) {
break;
}
}
if (j == index) {
tmpNums[index++] = nums[i];
}
}
nums = tmpNums;
return index;
} /**
* 方法2 先对nums排序,排序后重复的元素一定相邻,
* 然后遍历nums,并用index来表示不重复的元素应该存放的下标,
* 如果当前遍历的元素和他的前一个元素相等,那么他是重复的,遍历下一个;
* 如果不等,说明不是重复,那么当前元素存放到数组中下标为index的地方,index++
* 这样遍历下来,不同的元素都放到元数组的前面去了。
* 这种方法,得出来的是排序过得,数组原来的相对位置改变了。
* 时间复杂度和空间复杂度都是对应排序算法的复杂度
*
* @param nums 输入需要去重的数组
* @return 返回去重后数组的长度
*/
public static int unique2(int[] nums) {
if (nums.length == 0) {
return 0;
}
Arrays.sort(nums);
int index = 1;
for (int i = 1, len = nums.length; i < len; i++) {
if (nums[i] != nums[i - 1]) {
nums[index++] = nums[i];
}
}
return index;
} /**
* 方法3 利用直接插入排序的思想,把数组分成两部分,
* 左边认为是满足要求的不重复的部分,初始为1个元素nums[0];
* 而右边是等待遍历的部分,不断遍历右边的元素。
* 同样用index来表示左边部分不重复的元素应该存放的下标
* 对于当前遍历的元素,通过第二层循环遍历左边部分0到index的元素,
* 如果有元素和当前元素相等,说明是重复的,那么不处理;
* 否则,说明是不重复,那么插入到下标index的地方,index++
* 同样,遍历下来,不重复的元素被放到前面部分。
* 这种方法没有经过排序,数组原来的相对顺序可以保证。
* 这种方法,是对方法1的改进,用本数组的前部分替代新的数组
* 时间复杂度是n^2,空间复杂度是1
*
* @param nums 输入需要去重的数组
* @return 返回去重后数组的长度
*/
public static int unique3(int[] nums) {
if (nums.length == 0) {
return 0;
}
int index = 1;
for (int i = 1, len = nums.length; i < len; i++) {
int j = 0;
for (; j < index; j++) {
if (nums[j] == nums[i]) {
break;
}
}
if (j == index) {
nums[index++] = nums[i];
}
}
return index;
} /**
* 方法4 利用Java中容器来帮助判断元素是否重复。可以使用Set Map List等
* 这里我们利用Set容器不能存放相同的元素的特性,
* 同样用index来表示不重复的元素应该存放的下标
* 当前元素如果能够成功加入到Set容器中,说明这个元素还没有重复的,
* 那么当前元素就可以放到下标index的地方,index++;
* 如果add失败,那么说明重复了,不做操作。
* 这种方法,同样是把不重复的数组放到数组的前面, 并可以保证元素的相对位置不变, 不过需要额外的Set容器的空间。
* 时间复杂度是n,空间复杂度也是n
*
* @param nums 输入需要去重的数组
* @return 返回去重后数组的长度
*/
public static int unique4(int[] nums) {
if (nums.length == 0) {
return 0;
}
Set<Integer> set = new HashSet<Integer>();
int index = 0;
for (int i = 0, len = nums.length; i < len; i++) {
if (set.add(nums[i])) {
nums[index++] = nums[i];
}
}
return index;
} /**
* printNums 打印数组的从0到length元素
*
* @param nums 输入数组
* @param length 打印长度
*/
public static void printNums(int[] nums, int length) {
for (int i = 0; i < length - 1; i++) {
System.out.print(nums[i] + " ");
}
System.out.println(nums[length - 1]);
} /**
* main 函数
*
* @param args
*/
public static void main(String[] args) {
int[] nums = { 221, 3321, 4342, 2513, 436, 263, 2163, 44, 2351, 23261, 432, 12, 3, 123, 23, 12, 3, 2, 4, 23, 1,
2312, 4, 33, 21, 31, 23 };
printNums(nums, nums.length);
int len = unique4(nums);
printNums(nums, len);
}
}

java去除数组中重复的元素方法总结的更多相关文章

  1. [转]java去除List中重复的元素

    java去除List中重复的元素 如果用Set ,倘若list里边的元素不是基本数据类型而是对象, 那么请覆写Object的boolean   equals(Object   obj)   和int  ...

  2. array_unique() - 去除数组中重复的元素值

      array_unique() 定义和用法 array_unique() 函数移除数组中的重复的值,并返回结果数组. 当几个数组元素的值相等时,只保留第一个元素,其他的元素被删除. 返回的数组中键名 ...

  3. 关于iOS去除数组中重复数据的几种方法

    关于iOS去除数组中重复数据的几种方法   在工作工程中我们不必要会遇到,在数组中有重复数据的时候,如何去除重复的数据呢? 第一种:利用NSDictionary的AllKeys(AllValues)方 ...

  4. php 去除数组中重复元素

    去除数组中重复元素, 找了下可以一下两个函数 php array_flip()与array_uniqure() $arr = array(…………) ;// 假设有数组包含一万个元素,里面有重复的元素 ...

  5. JS去除数组中重复值的四种方法

    JS去除数组中重复值的四种方法 1 /// <summary>            o[this[i]] = "";  }      }       newArr.p ...

  6. php去除数组中重复数据

    <?php /** * 去除数组中重复数据 * by www.jbxue.com **/ $input = array("a" => "green" ...

  7. Python 去除列表中重复的元素

    Python 去除列表中重复的元素 来自比较容易记忆的是用内置的set l1 = ['b','c','d','b','c','a','a'] l2 = list(set(l1)) print l2 还 ...

  8. JavaScript去除数组中重复的数字

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  9. 集合求交集 & 去除列表中重复的元素

    集合求交集: set1 = {1,2,3,4,5} set2 = {4,5,6,7,8} 交集:set3 = set1 & set2 print(ste3) #结果为{4,5} 或者ste1. ...

随机推荐

  1. C++ Primer读书笔记(2)

    getline(cin,string s)可以读取一整行,包括空白符.使用ctrl+Z结束 字符串字面值与string是不同的类型.两个字符串字面值不能直接相加. 处理string对象中的字符时,C+ ...

  2. jQuery.lazyload详解(转)

    转自:http://www.cnblogs.com/wenbo/archive/2011/07/15/2107579.html <script type="text/javascrip ...

  3. CF 554B 找相同行

    给定一个由n*n块地砖铺成的房间,每块砖用0表示未打扫,1表示已打扫. 要求打扫时只能整列地扫,未打扫的会变为已打扫,已打扫的会变为未打扫.即1会变成0,而0会变成1,目标是 使最后整行为1的行数最大 ...

  4. Yeoman generator

    使用Yeoman generator来规范工程的初始化 前言 随着开发团队不断发展壮大,在人员增加的同时也带来了协作成本的增加:业务项目越来越多,类型也各不相同.常见的类型有基础组件.业务组件.基于R ...

  5. java线程中断的办法

    目录 中断线程相关的方法 中断线程 for循环标记退出 阻塞的退出线程 使用stop()方法停止线程 中断线程相关的方法 中断线程有一些相应的方法,这里列出来一下. 注意,如果是Thread.meth ...

  6. 让HTML5来为你定位(转)

    add by zhj: HTML5的地理定位返回的应该都是GPS坐标,即WGS-84坐标,参见Map Types - Google Maps JavaScript API v3 本文使用的是Chrom ...

  7. 新手:Qt之QLabel类的应用

    在Qt中,我们不可避免的会用到QLabel类.而Qlabel的强大功能作为程序员的你有多少了解? 下面,跟着我一起在来学习一下吧! 1.添加文本 Qlabel类添加文本有两种方式,一种是直接在实现时添 ...

  8. UML类图之间的关系

    1. 泛化(Generalization) [泛化关系]:是一种继承关系,表示一般与特殊的关系,它指定了子类如何特化父类的所有特征和行为.例如:老虎是动物的一种,即有老虎的特性也有动物的共性. [箭头 ...

  9. 【BZOJ 3027】 3027: [Ceoi2004]Sweet (容斥原理+组合计数)

    3027: [Ceoi2004]Sweet Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 71  Solved: 34 Description John ...

  10. 懒人的福利?教你用set维护斜率优化凸包

    斜率优化题目大家肯定都做得不少了,有一些题目查询插入点的x坐标和查询斜率都不单调,这样就需要维护动态凸包并二分斜率.(例如bzoj1492) 常规的做法是cdq分治或手写平衡树维护凸包,然而如果我不愿 ...