测试代码:
public class Demo01 { public int search(int[] nums,int target){ int L = 0,R = nums.length-1; while (L<=R){ int M = L + (R - L)/2; if(nums[M] == target){ return M; }else if (nums[M] < target){ L = M+1; }else { R = M-1; } } return -1; } public int search2(int[] nums,int target){ int L = 0,R = nums.length-1; while (L<=R){ int M = L + (R - L)>>1; if(nums[M] == target){ return M; }else if (nums[M] < target){ L = M+1; }else { R = M-1; } } return -1; } public static void main(String[] args) { //除法 long startTime1=System.nanoTime(); //获取开始时间 Demo01 d = new Demo01(); System.out.println(d.search(new int[]{-1, 0, 3, 5, 9, 12}, 2)); long endTime1=System.nanoTime(); //获取结束时间 System.out.println("程序运行时间: "+(endTime1-startTime1)+"ns"); //移位操作 long startTime2=System.nanoTime(); //获取开始时间 System.out.println(d.search2(new int[]{-1, 0, 3, 5, 9, 12}, 2)); long endTime2=System.nanoTime(); //获取结束时间 System.out.println("程序运行时间: "+(endTime2-startTime2)+"ns"); } }
执行代码时发现使用移位 *** 作直接超时,且程序一直处于运行态。
所以换了简单的测试代码
long startTime1=System.nanoTime(); //获取开始时间 System.out.println(4/2); long endTime1=System.nanoTime(); //获取结束时间 System.out.println("程序运行时间: "+(endTime1-startTime1)+"ns"); //移位 *** 作 long startTime2=System.nanoTime(); //获取开始时间 System.out.println(4>>1); long endTime2=System.nanoTime(); //获取结束时间 System.out.println("程序运行时间: "+(endTime2-startTime2)+"ns");
发现移位 *** 作确实比出发 *** 作的效率要高,最后通过debug发现
问题出在
//serach 一中 int M = L + (R - L)/2; //search2中 int M = L + (R - L)>>1; //这里先进行了加法 *** 作后,再进行移位 *** 作。所以造成了死循环。
因此度娘看了一眼简单运算符的优先级
所以,在编程中防止出现由于运算符优先级问题,可使用括号()代表优先级!!!
这可是最早接触的知识点,没想到在这栽了坑。
于是乎,在更正错误后执行结果如下:
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)