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

    // 面试题53(二):0到n-1中缺失的数字
    // 题目:一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字
    // 都在范围0到n-1之内。在范围0到n-1的n个数字中有且只有一个数字不在该数组
    // 中,请找出这个数字。
    
    #include <iostream>
    //可以用等差数列求和得到A,然后求数组全部数字和B,然后A-B是缺失的数字,但是该算法时间复杂度是O(n),没有利用递增排序的特点
    //可将问题转化为,使用二分查找思想找出第一个数字和下标不等的数字
    int GetMissingNumber(const int* numbers, int length)
    {
        if (numbers == nullptr || length <= 0)
            return -1;
    
        int left = 0;
        int right = length - 1;
        while (left <= right)
        {
            int middle = (right + left) >> 1;
            if (numbers[middle] != middle)
            {
                if (middle == 0 || numbers[middle - 1] == middle - 1)//如果中间点的下标和值不等,且前一个点的下标和值相等,则找到了
                    return middle;
                right = middle - 1;
            }
            else
                left = middle + 1;
        }
    
        if (left == length)
            return length;
    
        // 无效的输入,比如数组不是按要求排序的,
        // 或者有数字不在0到n-1范围之内
        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();
        system("pause");
        return 0;
    }
  • 相关阅读:
    洛谷 P1032 字串变换
    map && multimap
    【转载】Pycharm调试高效,还是pdb调试高效? (在服务端)
    弱国无外交 弱国一定无外交吗
    [转发]Linux性能测试工具之Lmbench特性、安装及使用
    fedora21 桌面用户自动登录lightdm.conf -20190520 方法
    获取显卡硬件信息lspci -vnn | grep VGA -A 12
    mate桌面用户 root 自动登录lightdm.conf -20190520 方法【fedora 21】mate
    在线文本差异对比
    【科目三】机考 教练不出话 态度要好
  • 原文地址:https://www.cnblogs.com/CJT-blog/p/10528127.html
Copyright © 2011-2022 走看看