剑指offer第二版-53.2.0~n中缺失的数字

本系列导航:剑指offer(第二版)java实现导航帖

面试题53.2:0~n中缺失的数字

题目要求:
一个长度为n的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n之内。在范围0~n内的n个数字有且只有一个数字不在该数组中,请找出。

解题思路:
用二分法找到数组中第一个数值不等于下标的数字。

package chapter6;

/**
 * Created with IntelliJ IDEA
 * Author: ryder
 * Date  : 2017/8/15
 * Time  : 15:03
 * Description:0~n中缺失的数字
 **/
public class P266_GetMissingNumber {
    public static int getMissingNumber(int[] data){
        int left = 0,right = data.length-1,mid;
        while (left<=right){
            //mid=left+(right-left)/2 用位运算替换除法
            //注意加减法优先级高于位运算
            mid = left+((right-left)>>1);
            if(data[mid]==mid)
                left = mid+1;
            else
                right = mid-1;
        }
        return left;
    }
    public static void main(String[] args){
        int[] data1 = new int[]{0,1,2,3,4,5}; //6
        int[] data2 = new int[]{0,1,3,4,5}; //2
        int[] data3 = new int[]{1,2}; //0
        System.out.println(getMissingNumber(data1));
        System.out.println(getMissingNumber(data2));
        System.out.println(getMissingNumber(data3));
    }
}

运行结果

6
2
0

推荐阅读更多精彩内容