有以下问题。假设我有一个数组[n],我想搜索多个数字,例如我想搜索12,45,1,6,8,5,如果每个数字存在数组,那么我可以得到有利的结果。所以有一种方法,我只选择一个像7的元素 如果它存在于数组编号[n]中,那么可以进入循环内部,并再次初始化另一个循环并检查第二个数字是否在数字[n]中,依此类推,所以这里需要相同数量的循环搜索号码的数量。那么还有另一种方法可以解决这个问题。因为它的运行时间将是多项式的。
这是我的代码:
import java.util.Scanner;
class Number {
boolean check(int[] num)
{
for (int i = 0; i < 5; i++) {
if (num[i] == 7) {
for (j = 0; j < 5; j++) {
if (num[j] == 8) {
for (int k = 0; k < 5; k++) {
if (num[k] == 9) {
return true;
}
else
continue;
}
} else
continue;
}
} else
return false;
}
}
public static void main(string [] args)
{
Number obj1 = new Number();
Scanner input = new Scanner(System.in);
int [] num =new int[5];
for(int i=0;i<5;i++)
num[i] =input.nextInt();
boolean get ;
get = obj1.check(num []);
System.out.print(response);
}
}
答案 0 :(得分:2)
你可以这样做。
public static boolean allFoundIn( int[] toSearch, int... numbers )
Set numbersSet = new HashSet(Arrays.asList(numbers));
numbersSet.removeAll(Arrays.asList(toSearch));
return numbersSet.isEmpty();
}
然后在main
中,请致电
allFoundIn(num, 7, 8, 9);
如果在数组true
中找到7,8和9,则会返回num
。
答案 1 :(得分:0)
这个解决方案不是最快的,因为它对每个数字进行二进制搜索。此外,它必须先排序。最好将所有源数放入哈希集中,就像David Wallace的解决方案一样。然后每个搜索时间都是常量,而不是取决于源数组的大小。
boolean check(int[] num) {
int[] toSearch = new int[] { 12, 45, 1, 6, 8, 5 };
for (int search : toSearch) {
if (Arrays.binarySearch(num, search) == -1) {
return false;
}
}
return true;
}
如果你想使用哈希集,你可以这样做:
boolean check(Integer[] num) {
HashSet<Integer> numSet = new HashSet<>(Arrays.asList(num));
int[] toSearch = new int[] { 12, 45, 1, 6, 8, 5 };
for (int search : toSearch) {
if (!numSet.Contains(search)) {
return false;
}
}
return true;
}
答案 2 :(得分:0)
如果你想要一个子多项式解,那么有几种可能性。
1)对两个列表进行排序,然后像这样循环(伪代码)
toFind = <first element of listToFind>
for i in listToSearch:
if i == toFind:
if toFind is last element of listToFind:
return true
toFind = next element of listToFind
else if i > toFind:
return false
2)将列表的所有元素放入HashSet中进行搜索。然后循环遍历要查找的元素,看它是否在HashSet中。如果他们都是,那么他们都在列表中。如果没有,那么他们就不在列表中。 HashSet具有快速查找功能,因此它可能比多项式时间更好。
因为我已经被打败了2,所以我会停止考虑替代方案并发布。
答案 3 :(得分:0)
是的,你可以大大减少传球次数。首先,不要硬编码你搜索这样的数字,每个都有一个单独的循环。创建一个数组来存储要搜索的数字,另一个数组包含要搜索的数字。按相同方向对每个进行排序,例如升序。创建两个整数作为计数器,每个阵列一个。现在使用while循环来比较计数器所在位置的每个数组中的数字。
如何推进计数器取决于数字的比较方式。如果要搜索的数组中的数字大于搜索的数字,则推进正在搜索的数字。如果相反的方式推进被搜索的那个,如果相等,你前进并记录匹配。继续前进,直到到达一个数组的末尾。
使用此方法,您最多只能遍历一次数组。我会编写示例代码,但我正在手机上打字!