java如何确定一个数组是否包含一个单独数组中的所有整数
我在学校的ap计算机科学课上,我被这个问题困住了。甚至不能想出解决问题的办法
这里是逐字逐句:
编写一个名为contains
的静态方法,该方法接受两个整数数组a1和a2作为参数,并返回一个布尔值,指示a2的元素序列是否出现在a1中(true表示是,false表示否)。a2中的元素序列可能出现在a1中的任何位置,但必须连续出现,且顺序相同。例如,如果名为list1和list2的变量存储以下值:
int[] list1 = {1, 6, 2, 1, 4, 1, 2, 1, 8};
int[] list2 = {1, 2, 1};
那么contains(list1, list2)
的调用应该返回true,因为list2的值序列{1, 2, 1}
包含在从索引5开始的list1中。如果list2存储了值{2, 1, 2}
,那么contains(list1, list2)
的调用将返回false,因为list1不包含该值序列。具有相同元素的任何两个列表都被视为相互包含,因此contains(list1, list1)
之类的调用应该返回true
您可以假设传递给方法的两个数组的长度至少为1。您不能使用任何字符串来帮助解决此问题,也不能使用生成字符串的方法,例如数组。toString
如果有人能给我指出正确的方向,那就太好了
这里还有一个我提出的尝试,但它没有足够的测试次数
public static boolean contains(int[] set1, int[] set2) {
boolean contains = false;
for (int i = 0; i < set1.length; i++) {
for (int a = 0; a < set2.length - 1; a++) {
if (set1[i] == set2[a] && set1[i + 1] == set2[a + 1]) {
contains = true;
} else {
contains = false;
}
}
}
return contains;
}
# 1 楼答案
我想说的是,就心态而言,你应该认为“第一个元素与阵列对抗,直到匹配为止”
从这个意义上讲,您只需要在第二个数组中按需要进行比较。如果在遍历了
set2
中的所有元素后,得到的长度相同,那么它就包含在set1
中。当然,如果你有问题,可以问:)# 2 楼答案
Demo of this answer at IDEOne.com
我想出了以下函数。阅读评论,了解其背后的逻辑:
# 3 楼答案
下面是一种递归方法:
每次找不到匹配序列时,我们都会创建数组的一个子集,不包括第一个元素,并将其传递回contains以继续检查。以下是每个迭代的输出:
第一次:set1= [1,6,2,1,4,1,2,1,8]和set2=[1,2,1] 在数组的开头没有找到匹配项(我们在比较6和2时中断。下一个递归调用是:
set1= [6,2,1,4,1,2,1,8],[1,2,1]
下一个递归比较[2,1,4,1,2,1,8][1,2,1]
依此类推,直到最后的递归比较: [1,2,1,8][1,2,1]并按顺序查找匹配项