我们假设我有一个长度为#(apply / (cons % list))
的数组,其中唯一可以出现的值是0-9。我想创建一个递归函数,返回数组中不同值的数量。
例如,对于以下数组:n
- >该函数将返回int[] arr = {0,1,1,2,1,0,1}
,因为此数组中出现的唯一值是3
,0
和1
。
该函数接收一个int数组并返回int 像这样的东西:
2
答案 0 :(得分:4)
如果您使用的是Java 8,则可以使用简单的单行程序执行此操作:
IntStream
Arrays.stream(array)
返回由数组元素组成的IntStream
。然后,distinct()
返回仅包含此流的不同元素的count()
。最后,count()
返回此流中的元素数。
请注意,long
会返回int
,因此我们需要将其转换为{{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