元素去重
题目要求:
输入:1,1,2,3,3,5,7,7,8,12,12,13
输出:1,2,3,5,7,8,12,13
方法一 直观查找
即放入数组,逐个对比
方法二 抽象数据类型查找
set红黑树
散列表(暂未接触)
方法三 L、R双边界
由上图可见,我们设置两个“哨兵点”,即arr[left]
,arr[right]
,只存储两个元素
每当arr[left]!=arr[right]
时,使left = right
,之后再进行比较。
代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
public class Main
{
//元素去重,以1,1,2,3,3,5,7,7,8,12,12,13为例
public static void main(String[] args)
{
int[] arr = {1,1,2,3,3,5,7,7,8,12,12,13};
int left = 0;
int right = 0;
while(right < arr.length){
if(arr[right] != arr[left]){
//这样不能输出最后一个元素
System.out.println(arr[left]);
//这样则不能输出第一个元素
//System.out.println(arr[left]);
left = right;
}
right++;
}
//输出最后一个元素
if(arr.length > 0){
System.out.println(arr[right-1]);
}
}
}
此处有一个需要注意的地方:
-
是输出arr[left]还是arr[right]呢? 看代码我们可以知道,
right++
在System.out.println(arr[left]);left = right;
之后。所以,当右哨兵到达最后一位时,arr[right]不会输出,所以我们在最后:
1 2 3 4
//输出最后一个元素 if(arr.length > 0){ System.out.println(arr[right-1]); }