算法题:只出现一次的数字(变体)

一道笔试题。

最近笔试碰到的,和 LeetCode 中的《只出现一次的数字》类似,但是又很不一样。

题目

对于一串数字,有的只出现一次,有的会出现多次,请输出只出现了一次的数字。如果没有只出现了一次的数字,则输出 “empty”。

输入

一行数字,空格分隔。

1 2 1 3 5 6 3 4

数字范围:-1 000 000 到 1 000 000 之间

输出

一行数字,空格分隔。要求按照输入顺序输出。

示例

示例1

输入:1 2 1 3 5 6 3 4

输出:2 5 6 4

示例2

输入:1 1 1 1

输出:empty

分析

这个问题和数组去重问题类似,但是还不一样。因为去重是要求多份相同数据只保留一份。但是本题是如果有重复的就一份也不保留。

可以使用 HashMap 进行计数。也可以考虑使用数组进行统计,但是使用数组的缺点是要根据数据的取值范围来设定数组的大小,而不是数据的输入规模来设定数组的大小,可能会非常浪费空间。

解答1[Java]:

核心思路

因为要求按照输入顺序输入,所以选择了 LinkedHashMap 进行计数和输出。

代码

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
29
30
31
import java.util.*;

public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
LinkedHashMap<Integer, Integer> map = new LinkedHashMap<>();
int printCount = 0;

while (in.hasNextInt()) {
int num = in.nextInt();
if (map.get(num) == null){
map.put(num, 1);
} else {
map.put(num, map.get(num)+1);
}
}

Set<Map.Entry<Integer, Integer>> entries = map.entrySet();

for(Map.Entry<Integer, Integer> entry : entries){
if(entry.getValue() == 1){
++printCount;
System.out.print(entry.getKey() + " ");
}
}

if(printCount == 0){
System.out.println("empty");
}
}
}

解答2[Java]:

1
2


参考资料

  1. Map 综述(二):彻头彻尾理解 LinkedHashMap
  2. Java数组去重问题