算法--找数--Java实现

版权声明: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]);
        }
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_43584220/article/details/89573320
今日推荐