1. 程式人生 > >【Java】 劍指offer(53-2) 0到n-1中缺失的數字 《劍指Offer》Java實現合集 《劍指Offer》Java實現合集

【Java】 劍指offer(53-2) 0到n-1中缺失的數字 《劍指Offer》Java實現合集 《劍指Offer》Java實現合集

 

本文參考自《劍指offer》一書,程式碼採用Java語言。

更多:《劍指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

  

更多:《劍指Offer》Java實現合集