题目
一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0到n-1之内。在范围0到n-1的n个数字中有且只有一个数字不在该数组中,请找出这个数字。
解题思路
采用二分法来解决问题
如果数组中间的那个数等于其下标,那么要找的数应该在数组的后半段;low = mid+1
如果数组中间的那个数不等于其下标,
如果中间的那个数前面的数字等于它的下标,那么现在中间的数的下标即为所求。
如果中间那个数前面的数字不等于它的下标,那么要找的数就在数组的前半段:high = mid - 1;
测试用例
1.功能测试(缺失数字位于数组开头、中间或者结尾)
2.边界值测试(数字只有0或1)
2.特殊测试(null)
代码
package mySword;
public class MissingNumber {
public static 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-low)/2;
if(arr[mid] != mid) {
if(mid == 0 || arr[mid-1] == mid-1)
return mid;
high = mid-1;
}else {
low = mid+1;
}
}
return -1;
}
public static void main(String[] args) {
int[] arr = {0, 1, 2, 3, 5};
System.out.println(getMissingNumber(arr));
}
}
总结
本题采用二分法的思路,值得借鉴。