已知一个升序数组arr,和一个整数num,找出小于等于num的数的最大索引。即最右的索引。

import java.util.Arrays;

/**
 * 已知一个升序数组arr,和一个整数num,找出小于等于num的数的最大索引。即最右的索引。
 */
public class Code03_BSNearRight {
    public static int mostRightNoMoreIndex(int arr[], int num) {
        int L = 0;
        int R = arr.length - 1;
        int t = -1;
        while (L <= R) {
            int mid = L + ((R - L) >> 1);
            if (arr[mid] <= num) {
                t = mid;
                L = mid + 1;
            } else {
                R = mid - 1;
            }
        }
        return t;
    }

    public static int test(int[] arr, int num) {
        for (int i = arr.length - 1; i >= 0; i--) {
            if (arr[i] <= num) {
                return i;
            }
        }
        return -1;
    }

    public static int[] generateRandomLenAndRandomValue(int maxLen, int maxValue) {
        int[] arr = new int[(int) (Math.random() * maxLen)];
        for (int i = 0; i < arr.length; i++) {
            arr[i] = (int) (Math.random() * (maxValue + 1)) - (int) (Math.random() * maxValue);
        }
        return arr;
    }

    public static void printArr(int[] arr) {
        if (arr == null) {
            return;
        }
        for (int i = 0; i < arr.length; i++) {
            System.out.print(arr[i] + " ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        int testTimes = 10000;
        int maxLen = 10;
        int maxValue = 100;
        boolean succeed = true;
        for (int i = 0; i < testTimes; i++) {
            int[] arr = generateRandomLenAndRandomValue(maxLen, maxValue);
            Arrays.sort(arr);
            int num = (int) (Math.random() * (maxValue + 1)) - (int) (Math.random() * maxValue);
            if (test(arr, num) != mostRightNoMoreIndex(arr, num)) {
                System.out.println(num);
                printArr(arr);
                System.out.println(test(arr, num));
                System.out.println(mostRightNoMoreIndex(arr, num));
                succeed = false;
                break;
            }
        }
        System.out.println(succeed ? "ok!" : "fucking fucked!");
    }
}

 

posted @ 2022-06-16 09:54  TheFloorIsNotTooHot  阅读(42)  评论(0)    收藏  举报