给定一个 0 到 10 范围内的四个数字序列,我如何提取有多少数字是唯一的?
例如:
- 10、10、10、10 = 1 个数字
- 10,10,9,10 = 2 个不同的数字
- 10,8,7,9 = 4 个不同的数字
- 10, 9, 10, 8 = 3 个不同的数字
给定一个 0 到 10 范围内的四个数字序列,我如何提取有多少数字是唯一的?
例如:
这里首先要注意的是,这个练习并不是关于数字 [0,10]。它实际上是关于拥有四个不同的元素,它们可以相同也可以不同。(它们可以是数字、拉丁字母、苹果、香蕉、橙子等)
我们正在寻找一个函数 (x1,x2,x3,x4) -> n 其中,在这种特定情况下,每个 x 都是一个整数 [0,10] 并且 n 始终是元组中不同元素的数量,范围从1 到元组的长度,在本例中为 4。(正好有 4 个数字也很随意。)
为了扩展 Hovercraft 的答案,Set
接口及其实现,例如HashSet
,在这里提供一个便宜、实用的解决方案:
public int getDistinctCount(int x1, int x2, int x3, int x4) {
Set<Integer> set = new HashSet<Integer>();
set.add(x1);
set.add(x2);
set.add(x3);
set.add(x4);
int count = set.size();
return count;
}
这是有效的,因为本质上,练习要求我们将元组(或多集)特征映射到集合特征。给定一个元组 t,如果它是一个集合,它的基数是多少?
要了解发生了什么(如果你不是很清楚),值得阅读HashSet
(以及AbstractSet
从那里......)的源代码,并考虑如果两个类都不存在,我们将如何实现它。
基本上,我们需要遍历四个(或有多少个)数字的列表,并跟踪我们已经看到的元素。对于每个元素,我们需要遍历我们已经看到的元素,以确定它是否对我们来说是新的。如果是,我们增加一个“不同元素”计数器。或者,我们可以在最后计算不同的元素,如上面的解决方案。
Set<Integer>
诸如 a之类的HashSet<Integer>
可以简化事情,因为它不允许重复。它将允许您对 Set 的重复项调用 add 方法,但如果 Set 已经包含该项目,则 add 方法除了 return 之外什么都不做false
。添加所有项目后获取size()
集合,将告诉您存在多少非重复项目。