• 又一次离谱的错误——运算符优先级


    今天在写二分查找,计算中间值的时候是这样写的:

    long mid = left + (right - left) >> 1;
    然后提交一直都是超时,脑改了很多地方都不行,只能debug,发现循环死在left=16,right=30时,由于循环一直是进入left=mid+1中,然而mid根本没有变,所以left也没有变,遂加一个括号:
    long mid = left + ((right - left) >> 1);
    AC 100%。。。
    已经在运算符优先级上吃了很多次亏了,(还有个比较有趣的是i++和++i这种错误),这种错误真的就是程序员的基础知识不牢固的缺陷,关键是错了还不容易察觉,凭脑洞debug的话。所以在这篇博客记录下JAVA的运算符优先级:

    再贴一个东哥的二分查找,找左右边界的代码框架,推荐大家学算法可以关注 labuladong。

    int binary_search(int[] nums, int target) {
        int left = 0, right = nums.length - 1; 
        while(left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] < target) {
                left = mid + 1;
            } else if (nums[mid] > target) {
                right = mid - 1; 
            } else if(nums[mid] == target) {
                // 直接返回
                return mid;
            }
        }
        // 直接返回
        return -1;
    }
    
    int left_bound(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] < target) {
                left = mid + 1;
            } else if (nums[mid] > target) {
                right = mid - 1;
            } else if (nums[mid] == target) {
                // 别返回,锁定左侧边界
                right = mid - 1;
            }
        }
        // 最后要检查 left 越界的情况
        if (left >= nums.length || nums[left] != target)
            return -1;
        return left;
    }
    
    
    int right_bound(int[] nums, int target) {
        int left = 0, right = nums.length - 1;
        while (left <= right) {
            int mid = left + (right - left) / 2;
            if (nums[mid] < target) {
                left = mid + 1;
            } else if (nums[mid] > target) {
                right = mid - 1;
            } else if (nums[mid] == target) {
                // 别返回,锁定右侧边界
                left = mid + 1;
            }
        }
        // 最后要检查 right 越界的情况
        if (right < 0 || nums[right] != target)
            return -1;
        return right;
    }
    
  • 相关阅读:
    C# 文件流
    SQL语句(十八_补充)——存储过程
    SQL语句(十九)——存储过程(练习)
    SQL语句(十八)—— 存储过程
    软件测试(二)PICT的使用 组合测试方法(两两组合测试,可遍历组合测试)
    Swing布局管理器
    软件测试(一)-黑盒测试 随机测试技巧
    (一)在Lingo中使用集合
    数学建模 TSP(旅行商问题) Lingo求解
    哲学家进餐问题
  • 原文地址:https://www.cnblogs.com/alike/p/13582876.html
Copyright © 2020-2023  润新知