在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; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现