又一次離譜的錯誤——運算子優先順序
阿新 • • 發佈:2020-08-29
今天在寫二分查詢,計算中間值的時候是這樣寫的:
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; }