一道笔试题。
最近笔试碰到的,和 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]:
参考资料
- Map 综述(二):彻头彻尾理解 LinkedHashMap
- Java数组去重问题