zoukankan      html  css  js  c++  java
  • 《剑指offer》第五十三题II:0到n-1中缺失的数字

    // 面试题53(二):0到n-1中缺失的数字
    // 题目:一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字
    // 都在范围0到n-1之内。在范围0到n-1的n个数字中有且只有一个数字不在该数组
    // 中,请找出这个数字。
    
    #include <cstdio>
    
    int GetMissingNumber(const int* numbers, int length)
    {
        if (numbers == nullptr || length <= 0)
            return -1;
    
        int start = 0;
        int end = length - 1;
        
        while (start <= end)
        {
            int middle = (end + start) >> 1;
            if (numbers[middle] != middle)  //如果下标不对应
            {
                if (middle == 0 || numbers[middle - 1] == middle - 1)  //首位或者前一位对应下标
                    return middle;
                else
                    end = middle - 1;
            }
            else
                start = middle + 1;
        }
    
        if (start == length)  //到末位
            return start;
    
        return -1;
    }
    // ====================测试代码====================
    void Test(const char* testName, int numbers[], int length, int expected)
    {
        if (testName != nullptr)
            printf("%s begins: ", testName);
    
        int result = GetMissingNumber(numbers, length);
        if (result == expected)
            printf("Passed.
    ");
        else
            printf("Failed.
    ");
    }
    
    // 缺失的是第一个数字0
    void Test1()
    {
        int numbers[] = { 1, 2, 3, 4, 5 };
        int expected = 0;
        Test("Test1", numbers, sizeof(numbers) / sizeof(int), expected);
    }
    
    // 缺失的是最后一个数字
    void Test2()
    {
        int numbers[] = { 0, 1, 2, 3, 4 };
        int expected = 5;
        Test("Test2", numbers, sizeof(numbers) / sizeof(int), expected);
    }
    
    // 缺失的是中间某个数字0
    void Test3()
    {
        int numbers[] = { 0, 1, 2, 4, 5 };
        int expected = 3;
        Test("Test3", numbers, sizeof(numbers) / sizeof(int), expected);
    }
    
    // 数组中只有一个数字,缺失的是第一个数字0
    void Test4()
    {
        int numbers[] = { 1 };
        int expected = 0;
        Test("Test4", numbers, sizeof(numbers) / sizeof(int), expected);
    }
    
    // 数组中只有一个数字,缺失的是最后一个数字1
    void Test5()
    {
        int numbers[] = { 0 };
        int expected = 1;
        Test("Test5", numbers, sizeof(numbers) / sizeof(int), expected);
    }
    
    // 空数组
    void Test6()
    {
        int expected = -1;
        Test("Test6", nullptr, 0, expected);
    }
    
    int main(int argc, char* argv[])
    {
        Test1();
        Test2();
        Test3();
        Test4();
        Test5();
        Test6();
    
        return 0;
    }
    测试代码

    分析:基础方法扩展。

  • 相关阅读:
    Java中OutOfMemoryError(内存溢出)的情况及解决办法
    php strtotime函数服务器和本地不相同
    Object传入String类型和其他
    Java静态变量,常量,成员变量,局部变量
    Vector使用
    Java反射机制
    List和ArrayList,LinkList的区别
    phpstrtotime()对于31日求上个月有问题
    PGsql解决时差24H
    drawable 另外一种形式dimens.xml
  • 原文地址:https://www.cnblogs.com/ZSY-blog/p/12654430.html
Copyright © 2011-2022 走看看