zoukankan      html  css  js  c++  java
  • 又一次离谱的错误——运算符优先级

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

    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;
    }
    
  • 相关阅读:
    30个热门的CSS3 Image Hover 脚本
    70个jQuery触摸事件插件 支持手势触摸!
    40个超酷的jQuery动画教程
    45个漂亮且有创意的HTML5网站展示
    40+极具创意的产品展示PSD模板
    25个开始学习HTMLE5的最好的资源
    25个很酷的jQuery倒计时脚本–添加动态计数器!
    45个wordpress自适应插件
    30+WordPress古典风格的主题古典却不失时尚
    为kindeditor上传图片添加水印(PHP版)
  • 原文地址:https://www.cnblogs.com/alike/p/13582876.html
Copyright © 2011-2022 走看看