【Java】 劍指offer(53-2) 0到n-1中缺失的數字 《劍指Offer》Java實現合集 《劍指Offer》Java實現合集
阿新 • • 發佈:2018-11-14
本文參考自《劍指offer》一書,程式碼採用Java語言。
題目
一個長度為n-1的遞增排序陣列中的所有數字都是唯一的,並且每個數字都在範圍0到n-1之內。在範圍0到n-1的n個數字中有且只有一個數字不在該陣列中,請找出這個數字。
思路
分析易知,陣列形式如下:
如果從頭到尾依次比較值與小標是否相等,時間複雜度為O(n),效率低。
由於是排序陣列,我們繼續考慮使用二分查詢演算法,結合上圖可知:
當中間數字等於其下標時,我們在後半部分查詢;
當中間數字不等於其下標時,
1)如果中間數字的前一個數字也不等於其下標,則在前半部分查詢;
2)如果中間數字的前一個數字等於其下標,則說明中間數字的下標即為我們所要找的數字。
測試算例
1.功能測試(缺失數字位於陣列開頭、中間或者結尾)
2.邊界值測試(數字只有0或1)
2.特殊測試(null)
Java程式碼
//題目:一個長度為n-1的遞增排序陣列中的所有數字都是唯一的,並且每個數字 //都在範圍0到n-1之內。在範圍0到n-1的n個數字中有且只有一個數字不在該陣列 //中,請找出這個數字。 public class MissingNumber { public int getMissingNumber(int[] arr) { if(arr==null || arr.length<=0) return -1; int low=0; int high=arr.length-1; while(low<=high) { int mid=(low+high)>>1; if(arr[mid]!=mid) { if(mid==0 || arr[mid-1]==mid-1) return mid; high=mid-1; }else { low=mid+1; } } return -1; } }
收穫
1.同53-3