标签:System arr int mid maxValue 索引 num 升序
import java.util.Arrays; /** * 已知一个升序数组arr,和一个整数num,找出大于等于num的数的最小索引。即最左的索引。 */ public class Code02_BSNearLeft { public static int mostLeftNoLessIndex(int[] arr, int num) { int L = 0; int R = arr.length - 1; int t = -1; while (L <= R) { int mid = L + ((R - L) >> 1);//防止溢出。 //注意,位移的这一层括号一定要加上,否则会先算加法,导致结果错误! //即"位运算符"和"加减乘除"的优先级一样,谁在前就先使用谁。 // int mid = (L + R) / 2; if (arr[mid] >= num) { t = mid;//更新t的索引位置 R = mid - 1;//更新R的位置。砍掉mid(含)的右边,R来到mid-1位置。 } else { L = mid + 1;//更新L的位置。砍掉mid(含)的左边,L来到mid+1位置。 } } return t; } public static int test(int[] arr, int num) { for (int i = 0; i < arr.length; 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) != mostLeftNoLessIndex(arr, num)) { System.out.println(num); printArr(arr); System.out.println(test(arr, num)); System.out.println(mostLeftNoLessIndex(arr, num)); succeed = false; break; } } System.out.println(succeed ? "ok!" : "fucking fucked!"); } }
标签:System,arr,int,mid,maxValue,索引,num,升序 来源: https://www.cnblogs.com/TheFloorIsNotTooHot/p/16380886.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。