1. 程式人生 > 實用技巧 >又一次離譜的錯誤——運算子優先順序

又一次離譜的錯誤——運算子優先順序

今天在寫二分查詢,計算中間值的時候是這樣寫的:

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;
}