【问题标题】:How do I find out if one of several values is located in an array in Java?如何确定几个值之一是否位于 Java 的数组中?
【发布时间】:2021-09-17 10:58:36
【问题描述】:

我是 Java 新手,正在尝试执行以下操作:

给定一个整数数组,如果数组中的整数在 70 到 79 之间,则打印“Yes”。否则,打印“否”。

到目前为止,这是我的代码:

import java.util.Arrays;

int temperatures[] = {45, 70, 71, 67}; //create array 
Arrays.sort(temperatures); //sort temperatures
int key = 70; //define key to be searched
int result = Arrays.binarySearch(temperatures,key);

我知道这会找到温度数组中的 70 值,但是使用 binarySearch 查看 70 年代的 ANY 值是否在数组中的最佳方法是什么?

【问题讨论】:

    标签: java arrays binary-search


    【解决方案1】:

    如果找不到元素,我们可以利用Arrays.binarySearch 返回-(insertion point) - 1 的事实。我们可以使用binarySearch 找到 70。如果找到了,太好了!否则,请查看插入点。如果超出范围,则每个元素都小于 70。否则,插入点将是数组中大于 70 的最小元素。如果大于或等于 80,我们知道没有数字在数组中的 70-79 范围内。

    如果你只是反转上面解释中的每个条件,你会得到:

    int result = Arrays.binarySearch(temperatures, 70);
    if (result >= 0 || // we found 70, or
       (-result - 1 < temperatures.length && // insertion point in range, and 
           temperatures[-result - 1] < 80) // insertion point less than 80
    ) {
      System.out.println("There is at least one temperature in the array that is within the range 70-79");
    }
    

    【讨论】:

      【解决方案2】:

      将布尔值设置为 false,从第一个元素开始遍历数组,在布尔值为 false 且索引小于数组长度时检查每个元素。如果元素介于 70 和 79 之间,则将布尔值设置为 true。检查布尔值,如果布尔值为真,则打印 yes。

      【讨论】:

      • 虽然这得到了正确答案,但它没有利用正在排序的数组,因此需要 O(n) 时间而不是 O(log n)。
      • 这看起来像是 CS101 课程的问题,所以我给出了答案。
      • 你的回答没有错,但我认为这个细节值得指出。
      • 我同意你所说的(如果数组已排序)。我想解释为什么我给出了我所做的答案(以及为什么它也只是一个算法答案)。问题的第一部分似乎是关于一个未排序的数组。然后提出问题的人建议对数组进行排序。并且对数组进行排序可能涉及到一个 nlog(n) 算法(Java 的 Arrays.sort 使用的算法是 nlog(n)?)。另外,如果问题是针对 CS 课程的,我的答案就是教授可能会寻找的答案。
      【解决方案3】:

      binarySearch 允许您指定Comparator,它定义了哪个项目更大以及它们何时相等。

      如果我们使用比较器来比较数字除以 10,那么我们可以使用binarySearch

      import java.util.Arrays;
      import java.util.Comparator;
      
      public class SO69217093 {
      
          public static void main(String[] args) {
              Comparator<Integer> comparator = new Comparator<Integer>() {
                  public int compare(Integer o1, Integer o2) {
                      int decade1 = o1 / 10;
                      int decade2 = o2 / 10;
                      return Integer.compare(decade1, decade2);
                  }
              };
              Integer temperatures[] = {45, 70, 71, 67}; //create array
              Arrays.sort(temperatures); //sort temperatures
              int key = 70; //define key to be searched
              int result = Arrays.binarySearch(temperatures,70, comparator);
              int result2 = Arrays.binarySearch(temperatures,80, comparator);
          }
      }
      

      因为Comparator 作用于对象,而不是基元,所以您需要使用Integer 的数组。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-10
        • 1970-01-01
        • 2012-02-22
        相关资源
        最近更新 更多