在给定数组中搜索多个数字

时间:2013-12-03 00:36:47

标签: java arrays

有以下问题。假设我有一个数组[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);

      }
}

4 个答案:

答案 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循环来比较计数器所在位置的每个数组中的数字。

如何推进计数器取决于数字的比较方式。如果要搜索的数组中的数字大于搜索的数字,则推进正在搜索的数字。如果相反的方式推进被搜索的那个,如果相等,你前进并记录匹配。继续前进,直到到达一个数组的末尾。

使用此方法,您最多只能遍历一次数组。我会编写示例代码,但我正在手机上打字!