版权声明:071623 https://blog.csdn.net/weixin_43584220/article/details/89573320
package ClassWork;
import java.util.Scanner;
/**
* 例7.1 找数
*
* 描述:
* 给一个长度为n的单调递增的正整数序列,即序列中每一个数都比前一个数大。有m个询问,每次询问一个x,问序列中最后一个小于等于x的数是什么?
* 输入:
* 第一行两个整数n,m。
* 接下来一行n个数,表示这个序列。
* 接下来m行每行一个数,表示一个询问。
* 输出:
* 输出共m行,表示序列中最后一个小于等于x的数是什么。假如没有输出-1。
* 样例输入:
* 5 3
* 1 2 3 4 6
* 5
* 1
* 3
* 样例输出:
* 4
* 1
* 3
* @author Ravanla
* @create 2019-04-26-17:40
*/
public class FindNumber {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入n(长度)和m(询问)");
int n = sc.nextInt();
int m = sc.nextInt();
int[] arr = new int[n + 1];
arr[0] = -1;
// 把数输入数组
for(int i = 1; i <= n; i++){
arr[i] = sc.nextInt();
}
// 二分法
for(int i = 1; i <= m ; i++){
int left = 1;
int right = n;
int mid;
System.out.println("请输入要询问的数");
int x = sc.nextInt();
while(left <= right){
mid = (left + right)/2;
if(arr[mid] <= x) left = mid + 1;
else right = mid - 1;
}
/**
* 最终循环结束时一定是Left=Right+1,
* 根据二分第②步的做法我们知道Right的右边一定都是大于x的,
* 而根据第③步我们可以知道Left左边一定是小于等于x的。
*/
System.out.println("这个数的后一个数为(或者就是其本身):" + arr[right]);
}
}
}