zoukankan      html  css  js  c++  java
  • 数据结构与算法--学习引入

    参考内容:万门大学.数据结构与算法进阶(python版本)哔哩哔哩学习视频  

    一、题目内容

    找到丢失的数字:现在你手上有n-1个数字,这些数字的范围是[1,n],且这n-1个数字中没有重复的数字。有上述条件可知:你手上的数字缺了一个。请编写一段高效的找到缺失数字的代码。

    二、题目分析

    此题是一道比较老的数据结构与算法考题,首先,在解答该题时,要进行一些题目的分析,题目分析我们主要做些什么呢?

    要弄清楚,这n-1个数字是排好序了的吗?

    该题有哪些解法思路呢?

    要通过分析时间复杂度和空间复杂度说明那种解法最优呢?

    最优解法的代码如何实现?

    能不能写出测试用例呢?

    三、题目解答

    排序后使用二分法查找

    list.sort()
    

    算法时间复杂度 =  排序的时间复杂度() + 二分查找的时间复杂度(log)
    image.png

    排序后使用线性查找

    算法时间复杂度 =  排序的时间复杂度() + 二分查找的时间复杂度(n)

    求和作差法

    思路:
    sum = 1+2+3+....+n = n(n-1)/2
    sum = sum - list[i]
    num = sum   //最后作差剩下的数

    def FindMissingNumber(nums):
        s = 0
        for i in range(0,nums[-1] + 1):
            s = s + i
        for n in nums:
            s = s - n 
        return s 
    
    print(FindMissingNumber([1,3,5,6,4,7])) 
    

    image.png

    计数排序

    有n个抽屉,每个抽屉里面放一个数,最后有空的抽屉就应该装缺失的数。

    def FindMissingNumber(nums):
            chouti  = [ 0 for i in range(len(nums)+1)]  # n(列表长度加1)个抽屉里面全为空
            for n in nums:
                chouti[ n-1] = 1   											# 将数放到对应的抽屉,并标记该抽屉也有数
            return  chouti.index(0)+1										# 获取空元素的下标并加1,因为下标是从0开始的
    print(FindMissingNumber([1,3,5,6,4,7]))
    

    排序后异或求解

    异或的知识:

    相同为0, 不同为1
    0 ^ 0 = 0	;   
    0 ^ 1 = 1	;
    1 ^ 0 = 1 ;
    1 ^ 1 = 0 ;
    
    8 ^ 3 = 1011
    1000
    0011
    1011
    
    A ^ A = 0
    A ^ 0 = A 
    1010
    1010 
    = 000
    1010
    0000
    = 1010 
    A ^ B ^ C ^ D = 0 //表示二进制数最后一位1的个数为偶数
    

    有了上面的思想, 我们可以将n-1 个数
    a```` , a````   ....    ,a```` 
    1,   2 ,   ....   , n 
    进行逐位异或,最后选出异或结果不为0的数。

    def FindMissingNumber(nums):
        new_nums = sorted(nums)
        n = len(new_nums)
        for i in range(1,n+2):
            if i^ new_nums[i-1] != 0:
                print(f"The Missing number is : {i} " )
                break
                
    FindMissingNumber([1,3,2,6,4,7])   
    

  • 相关阅读:
    团队计划
    python数据处理学习
    ShellExecute函数
    WinAPI WinMain函数
    I2C相关知识学习
    JavaScript多元运算符
    彻底理解js中的&&和||
    彻底理解线程同步与同步代码块synchronized
    JVM内存区域划分Eden Space、Survivor Space、Tenured Gen,Perm Gen解释
    JS参数使用带参数的方法
  • 原文地址:https://www.cnblogs.com/sinlearn/p/12882614.html
Copyright © 2011-2022 走看看