arrays - 使用二分搜索在排序数组中查找元素集合?
问题描述
这是我要解决的挑战:
输入:
第一行包含一个整数 n,使得 1 <= n <= 10^5。
第二行包含一个由 n 个自然数组成的数组,每个不超过 10^9。数组按升序排序。
第三行包含一个整数 k,使得 1 <= k <= 10^5。
第四行包含一个由 k 个自然数组成的数组,每个不超过 10^9。输出:
对于第二个数组中的每个数字,输出该数字在第一个数组中的索引。如果第一个数组中没有出现某个数字,则输出 -1。
在这个问题中,假设数组索引从 1 开始。
样本输入 1:
5 1 5 8 12 13 5 8 1 23 1 11
样本输出 1:
3 1 -1 1 -1
我的尝试:
import java.util.Scanner;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
// put your code here
Scanner sc = new Scanner(System.in);
int[] arrtoSearch = new int[sc.nextInt()];
for(int i = 0;i < arrtoSearch.length;i++){
arrtoSearch[i] = sc.nextInt();
}
int[] arr = new int[sc.nextInt()];
for(int j = 0;j < arr.length;j++){
arr[j] = sc.nextInt();
}
int[] newArr = new int[arr.length];
for(int k = 0;k < arr.length;k++){
System.out.println("arr[k]"+arr[k]);
newArr[k] = Arrays.binarySearch(arrtoSearch, arr[k]);
}
for(int k = 0;k < arr.length;k++){
System.out.println(newArr[k]);
}
}
}
问题
而不是预期的输出,我得到:
2
0
-6
0
-4
当没有匹配时,我怎样才能让它返回-1?
解决方案
该binarySearch
方法的文档:
返回:搜索键的索引,如果它包含在指定范围内的数组中;否则,
(-(insertion point) - 1)
。
当没有匹配时,该方法不一定返回 -1:它可能是另一个负数,正如您在运行代码时也可以看到的那样。你只知道负数表示没有匹配。
其次,您没有在任务中处理以下规范:
假设数组索引从 1 开始。
因此,更改以下内容:
newArr[k] = Arrays.binarySearch(arrtoSearch, arr[k]);
有了这个:
int res = Arrays.binarySearch(arrtoSearch, arr[k]);
newArr[k] = res < 0 ? -1 : res + 1;
推荐阅读
- appium - 线程“主”org.openqa.selenium.WebDriverException 中的异常:未知错误:调用函数结果缺少“值”
- c# - 格式化json字符串并将其传递给带有参数的正文会出错
- reactjs - 当 dimmer 设置为 {'blurring'} 时,在 Semantic-UI 模态后面显示 Toast 消息
- ruby-on-rails - 如何解决“您的 Ruby 版本是 2.5.3,但您的 Gemfile 指定 2.5.1”部署 AWS eb?
- asp.net - Web 服务(asmx)在 localhost 上完美运行,但在本地 IP 地址上无法正常运行
- c# - log4net-RollingFileAppender-XmlLayoutSchemaLog4j 未登录.Net Core 3
- haskell - 如何将只有函数(无模块)的多个 .hs 文件加载到 haskell ghci 中?
- r - dplyr 是否可以操作输入数据集?
- python - 由于 EnvironmentError 无法安装软件包:[Errno 30] 只读文件系统:
- c++ - 如何为 Visual Studio 2017 设置 llvm-c++ api