查找数组中有多少个不同的值

时间:2015-10-09 10:54:16

标签: java arrays recursion

我们假设我有一个长度为#(apply / (cons % list)) 的数组,其中唯一可以出现的值是0-9。我想创建一个递归函数,返回数组中不同值的数量。

例如,对于以下数组:n - >该函数将返回int[] arr = {0,1,1,2,1,0,1},因为此数组中出现的唯一值是301

该函数接收一个int数组并返回int 像这样的东西:

2

6 个答案:

答案 0 :(得分:4)

如果您使用的是Java 8,则可以使用简单的单行程序执行此操作:

IntStream

Arrays.stream(array)返回由数组元素组成的IntStream。然后,distinct()返回仅包含此流的不同元素的count()。最后,count()返回此流中的元素数。

请注意,long会返回int,因此我们需要将其转换为{{1}}。

如果您真的想要递归解决方案,可以考虑以下算法:

  • 如果输入数组的长度为1,则元素不同,因此答案为1。
  • 否则,让我们删除第一个元素并计算这个新数组上不同元素的数量(通过递归调用)。然后,如果第一个元素包含在这个新数组中,我们不再计算它,否则我们这样做,我们加1。

这应该为您提供足够的洞察力,以便在代码中实现这一点。

答案 1 :(得分:1)

试试这样:

public int myFunc(int[] array) {

     Set<Integer> set = new HashSet<Integer>(array.length);
     for (int i : array) {
        set.add(i);
     }
     return set.size();
 }

即,在Set中添加数组元素,然后可以返回Set的大小。

答案 2 :(得分:1)

您可以尝试以下代码段,

Integer[] arr = {0,1,1,2,1,0,1};
Set<Integer> s = new HashSet<Integer>(Arrays.asList(arr));

输出:[0,1,2]

答案 3 :(得分:0)

public int f(int[] array) {
   int[] counts = new int[10];
   int distinct = 0;
   for(int i = 0; i< array.length; i++) counts[array[i]]++;
   for(int i = 0; i< counts.length; i++) if(counts[array[i]]!=0) distinct++;
   return distinct;

 }

您甚至可以更改代码以获取每个值的出现次数。

答案 4 :(得分:0)

当你要求递归实现时,这是一种不好的方法。我说糟糕,因为递归不是解决这个问题的最佳方法。还有其他更简单的方法。当您想要根据以前从该函数生成的项目评估下一个项目时,通常使用递归。像斐波纳契系列一样。

当然,在使用此函数之前,您必须克隆数组,否则您的原始数组将被更改(使用uchar* getData(); const uchar* getData() const;调用它)

countDistinct(arr.clone(), 0);

答案 5 :(得分:0)

key