在arr上,返回arr中大于等于targetNum的最左的位置。

复制代码
package class01;

import java.util.Arrays;

/**
 * 在arr上,返回arr中大于等于targetNum的最左的位置。
 * (如果有,就返回这个最左的索引。如果没有,可以返回-1。)
 * 使用了二分法。
 */
public class Code05_BSNearLeft {
    public static void main(String[] args) {
        int maxSize = 30;
        int maxValue = 50;
        int testTimes = 10000;
        boolean flag = true;
        for (int i = 0; i < testTimes; i++) {
            int[] arr = generateRandomArr(maxSize, maxValue);
            int[] arr2 = copyArr(arr);
            Arrays.sort(arr);
            int targetNum = (int) (Math.random() * maxValue);
            int resultNum = nearestIndex(arr, targetNum);
            int test = test(arr, targetNum);
            if (resultNum != test) {
                System.out.println("oops!");
                flag = isFlag(arr, arr2, targetNum, resultNum, test);
            }
        }
        //及时所有的测试都通过了,也打印一次数据,查看结果。
        int[] arr = generateRandomArr(maxSize, maxValue);
        int[] arr2 = copyArr(arr);
        Arrays.sort(arr);
        int targetNum = (int) (Math.random() * maxValue);
        int test = test(arr, targetNum);
        int resultNum = nearestIndex(arr, targetNum);
        isFlag(arr, arr2, targetNum, resultNum, test);//方法复用

        System.out.println(flag ? "nice!" : "oops!");
    }

    private static boolean isFlag(int[] arr, int[] arr2, int targetNum, int resultNum, int test) {
        System.out.println("================================================");
        boolean flag;
        flag = false;
        System.out.println("原数组:");
        printArr(arr2);//原数组
        System.out.println("升序数组:");
        printArr(arr);//升序数组
        for (int index = 0; index < arr.length; index++) {//打印索引,看着方便。
            System.out.print(index + "\t");
        }
        System.out.println();
        System.out.println("targetNum = " + targetNum);
        System.out.println("test = " + test);
        System.out.println("resultNum = " + resultNum);
        System.out.println("================================================");
        return flag;
    }

    //核心方法
    public static int nearestIndex(int[] arr, int num) {
        int L = 0;
        int R = arr.length - 1;
        int temp = -1;
        while (L <= R) {
            int mid = L + ((R - L) >> 1);
            if (arr[mid] >= num) {
                temp = mid;
                R = mid - 1;
            } else {
                L = mid + 1;
            }
        }
        return temp;
    }

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

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

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

    public static int[] copyArr(int[] arr1) {
        int[] arr2 = new int[arr1.length];
        for (int i = 0; i < arr1.length; i++) {
            arr2[i] = arr1[i];
        }
        return arr2;
    }
}
复制代码

 

posted @   TheFloorIsNotTooHot  阅读(18)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示