zoukankan      html  css  js  c++  java
  • 【Java】 剑指offer(53-2) 0到n-1中缺失的数字

     

    本文参考自《剑指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;
                }
            }
            if(low==arr.length)
                return low;
            return -1;
        }
    }
    

      

    收获

      1.同53-3

      

    更多:《剑指Offer》Java实现合集  

  • 相关阅读:
    HTML DOM 06 节点关系
    HTML DOM 05 事件(三)
    HTML DOM 05 事件(二)
    HTML DOM 05 事件(一)
    html DOM 04 样式
    html DOM 03 节点的属性
    html DOM 02 获取节点
    html DOM 01 节点概念
    JavaScript 29 计时器
    JavaScript 28 弹出框
  • 原文地址:https://www.cnblogs.com/yongh/p/9958093.html
Copyright © 2011-2022 走看看