数组去重算法
⑴ 有序数组去重的几种算法
这个问题的意思是,如果假设一个数组中存在重复的数据项,那么就中保留重复数据项中的一个。也就是说最终输出的结果数组中不容许存在重复数据项,所以因为这里涉及到重复数据项的问题,所以立马想到了集合(Set)这个数据结构,因为它是不容序存在重复数据项的数据结构,
思路1.也就是将数组中的所有元素插入到一个Set中,利用Set的自动剔除重复数据项的功能,将导致所有重复数据项没有办法插入成功,也就是add方法
返回false,然后调用toArray方法,返回这个集合所对应的数组。那么这个数组就是一个没有重复数据项的数组,利用这个方法,通过比较结果数组和
源数组之间的大小,查看源数组中到底是否存在重复数据项。
思路2.除了利用Set这个数据结构不容序存在重复数据项的功能之外,还有一种很容易想到的方法,也就是对整个数组进行排序,然后遍历排序之后的数组,将重复数据项,清除掉。
思路1的实现:
public static int[] noDup(int[] array) {
Set<Integer> set = new
HashSet<Integer>();
for (int i :
array)
set.add(i);
Integer[]
integers = (Integer[]) set.toArray();
int[] result
= new int[integers.length];
for (int i =
0; i < integers.length; i++)
result[i] =
integers[i];
return
result;
}
思路2的实现:
使用快速排序等算法对数组进行排序,这个排序过程不在介绍。假设下面这个算法的输入是一个几经排好序的数组。
for (int i = 0; i < array.length - 1; i++) {
if (array[i]
== array[i + 1]) {
array[i] =
-1;
}
}
通过上面这段代码就能够实现把数组中所有的重复数据项只保留一个,其它的置为-1或者根据实际情况置成其它值。然后遍历数据,删除所有位-1的数据项,并且将数组中包含的记录个数不断减少即可。
⑵ 关于如何去除数组中重复项
数组去重,就是在数组中查找相同的元素,保留其中一个,去除其他元素的程。
从这句话揭示了数组去重的两个关键因素:
找到重复项
去除重复项
本文告诉你在遇到去重问题时该如何思考,并以 JavaScript 为例,进行详细解释。使用 JavaScript 示例主要是因为它环境比较好找,而且直接对象 (Plain Object) 用起来很方便。
JavaScript 的环境:Node.js 或者浏览器的开发者控制台。
找到重复项
找到重复项最关键的算法是判定元素是否相同。判定相同,说起来似乎很简单 —— 用比较运算符就好了嘛!真的这么简单吗?
用 JavaScript 来举个例:
const a = { v: 10 };
const b = { v: 10 };
肉眼观察,这里的a和b相同吧?但是 JavaScript 不这么认为:
console.log(a == b); // false
console.log(a === b); // false
肉眼观察和程序比较使用了不同的判断方法。肉眼观察很直接的采用了字符串比对的方法,而程序压根没管是不是数据相同,只是直接判断它们是不是同一个对象的引用。我们一般会更倾向于使用符合人眼直观判断的方法,所以可能会想到使用JSON.stringify()把对象变成字符串来判断:
console.log(JSON.stringify(a) === JSON.stringify(b)); // true
现在如果我们把a和b略作改变,又该如何?
const a = { v: 10, n: "1" };
const b = { n: "1", v: 10 };
乍一看,a和b不同。用JSON.stringify()的结果来比对,也确实不同。但是仔细一看,他们的属性是完全相同的,唯一的区别在于属性的顺序不一样。那么到底顺序应不应该作为一个判断相同的依据呢?
这个问题现在真没法回答。“该如何”取决于我们的目标,也就是业务需求。
从上面的例子我们可以了解:判断相同并不是一个简单的事情,根据不同的业务要求,需要选择不同的判断方法;而不同的判断方法,可能产生不同的判断结果。
接下来先讲讲常见的判断方法。
最直接的:比较运算符
比较运算符主要用于比较基本类型的值,比如字符串、数、布尔等。
普通比较运算符 (==) 在比较不同类型的值时,会先把它们转换为相同类型再来比较;而严格比较运算符 (===) 则更为严格,会直接将类型不同值判定为不同。这些都是基本的 JavaScript 语法知识。现代开发中为了能更好的利用工具,除极少数特殊情况外,都应该使用===来进行判断。尤其是在 TypeScript 中,几乎都不会出现==了。
JavaScript 中,比较运算符不会比较对象属性,只会比较对象的引用是否相同。如果要比较对象具体信息,需要用到接下来讲到的方法。