Introduction
现有 N 个大理石,每个大理石上写了一个非负整数。首先请你将这 N 块大理石按照它们上面所写数字的大小从小到大排序,然后按照排序后的顺序把这 N 个大理石从 1 ~ N 编号。之后请你回答 Q 个询问,每个询问问是否存在一个大理石上写着某个整数 x,如果存在,请你回答写着整数 x 的编号最小的大理石的编号,如果不存在,请你输出 x not found。
Input
有多组数据。
每组数据第一行包括两个整数 N,Q,当输入为 N = 0, Q = 0 时,表示结束。
否则接下来 Q 行,每一行包括一个数字 x,表示询问。
Output
对于每组测试数据,首先输出 “Case# XX”,XX 为测试数据编号,按读入顺序由 1 开始递增。
然后输出的话,下面的案例很清晰了。
Sample
input
4 1
2
3
5
1
5
5 2
1
3
3
3
1
2
3
0 0
output
CASE# 1:
5 found at 4
CASE# 2:
2 not found
3 found at 3
Solution
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner s=new Scanner(System.in);
int index=1;
while (true){
int n=s.nextInt();int m=s.nextInt();
if(n==0&&m==0)break;
int[] arr=new int[n];
for(int i=0;i<n;i++){
arr[i]=s.nextInt();
}
Arrays.sort(arr);
System.out.println("CASE# "+index+":");
for(int j=0;j<m;j++){
int k=s.nextInt();
int i = binarySearch(arr, k);
if(i==-1){
System.out.println(k+" not found");
}else {
System.out.println(k+" found at "+i);
}
}
index++;
}
}
static int binarySearch(int[] arr,int k){
int low=0,high=arr.length-1;
while (low<high){
int mid=(low+high)>>1;
int key=arr[mid];
if(k==key){
high=mid;
}else if(k<key) {
high=mid-1;
}else {
low=mid+1;
}
}
if(arr[low]!=k){
return -1;
}
return low+1;
}
}
Experience
第一次没有使用Arrays自带的二分查找的函数,因为要实现左二分的话,最好自己来实现。发现也没花多少时间。