-1

给定一个 0 到 10 范围内的四个数字序列,我如何提取有多少数字是唯一的?

例如:

  • 10、10、10、10 = 1 个数字
  • 10,10,9,10 = 2 个不同的数字
  • 10,8,7,9 = 4 个不同的数字
  • 10, 9, 10, 8 = 3 个不同的数字
4

2 回答 2

1

这里首先要注意的是,这个练习并不是关于数字 [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从那里......)的源代码,并考虑如果两个类都不存在,我们将如何实现它。

基本上,我们需要遍历四个(或有多少个)数字的列表,并跟踪我们已经看到的元素。对于每个元素,我们需要遍历我们已经看到的元素,以确定它是否对我们来说是新的。如果是,我们增加一个“不同元素”计数器。或者,我们可以在最后计算不同的元素,如上面的解决方案。

于 2013-09-08T19:54:55.583 回答
1

Set<Integer>诸如 a之类的HashSet<Integer>可以简化事情,因为它不允许重复。它将允许您对 Set 的重复项调用 add 方法,但如果 Set 已经包含该项目,则 add 方法除了 return 之外什么都不做false。添加所有项目后获取size()集合,将告诉您存在多少非重复项目。

于 2013-09-08T19:09:59.583 回答