任何人都可以帮我提供从数组中查找重复值的代码。这里的条件是没有循环语句。我尝试使用递归方法,但它没有成功。请有人帮我这个。
我的尝试:
public static void main(String[] args) {
Integer a[] = { 1, 2, 7, 3, 4, 5, 2, 7 };
ArrayList<Integer> al = new ArrayList<Integer>(Arrays.asList(a));
if (duplicate(al) == true) {
System.out.println("Duplicate");
}
}
static int i = 1;
private static boolean duplicate(ArrayList<Integer> al) {
if (al.get(i) != null) {
if (al.get(i - 1) == al.get(i)) {
System.out.println("Duplicate are : " + al.get(i));
}
} else {
return true;
}
i++;
return duplicate(al);
}
答案 0 :(得分:1)
请参考以下代码以查找无循环的数组中的重复项
公共类ArrayDuplicate {
public static void main(String[] args) {
findDuplicateElementsInArray(new int[] { 20, 10, 20, 5, 10 });
}
private static void findDuplicateElementsInArray(int arr[]) {
Set<Integer> uniqueElements = new LinkedHashSet<Integer>();
Arrays.stream(arr).filter(i -> !uniqueElements.add(i)).forEach(System.out::println);
}
}
答案 1 :(得分:0)
这不是一个很好的递归用例,这让我想知道问题的关键点是什么。然而,值得注意的是,LISP程序员(从我所观察到的)传统上一直使用递归;早期版本的语言可能没有任何类型的循环结构。以这种方式编程时,人们习惯于弄清楚如何使用递归算法,这种算法将成为任何其他语言的循环。
我认为,主要技术是弄清楚你需要保留哪些运行局部变量,并将它们作为参数传递给递归辅助函数。
要通过循环来解决这个问题,我会定义一个最初为空的Set
。当我浏览数组时,我会:(1)查看数组元素是否已经在集合中,如果是,则返回true
; (2)将元素添加到集合中。
此处,Set
是您需要保留的运行变量。数组索引是另一个“运行变量”。 (在经典的LISP中,你只需使用一个cdr
函数,这意味着“列表的其余部分”,所以你不需要维护一个索引;我认为用Java很容易做到这一点ArrayList
。)因此,您需要一个具有Set
和“当前索引”作为参数的递归方法:
private boolean hasDuplicateHelper(ArrayList<Integer> a, int currentIndex, Set<Integer> alreadySeen) { ... }
outer方法将set初始化为空集,并使用此set调用helper,并将0作为当前索引。递归方法将(1)查看当前元素并查看它是否在alreadySeen
中,如果是,则返回true
; (2)将当前元素添加到集合中; (3)使用新集合作为alreadySeen
参数递归调用该方法,并使用当前索引的相应新值(我会让你想出那个)。
我会留给你解决其余细节,例如如何停止。
编辑:现在从评论中可以清楚地看到,期望的结果是打印重复值而不是“是”或“否”,必须改变一些东西。但我认为只需将方法结果更改为包含一组所有重复项的Set<Integer>
即可。如果需要更多信息,例如重复发生的索引或每次重复发生的次数,则可能必须使用不同的结果结构。
答案 2 :(得分:0)
我完成了代码,无需使用循环语句即可从数组中找到重复的数字。我实现了两次递归来完成代码。请检查下面的代码
$("#tblInfo").dataTable({
'pageLength': 25,
'lengthMenu': [[10, 25, 50, 100, 150, 200, 250], [10, 25, 50, 100, 150, 200, 250]]
});
答案 3 :(得分:0)
您可以尝试一下。如果传递数组对象,则它将返回重复计数。
public static int findDuplicatesCountOnArray(Integer[] arr) {
List<Integer> list = new ArrayList<Integer>();
if (arr != null) {
list.addAll(Arrays.asList(arr));
}
HashSet<Integer> set = new HashSet<Integer>(list);
return list.size() - set.size();
}