• Leetcode刷题日记(2020.06.02):面试题53-II.0~n-1中缺失的数字


    题目难度:简单

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

    实例如下:

    这道题我自己开始的分析:

    我将其分为三种情况进行考虑:

    a.当数组缺失的是数值0,即为第一个元素缺失;

    b.当数组中缺少中间值;

    c.当数组中缺少最大值,即最末位的元素

    代码如下:

    class Solution(object):
        def missingNumber(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            # 情况1:第一位元素缺失
            if len(nums) == 1 & nums[0] == 1:
                return 0
            # 情况二:中间值缺失
            for i in range(len(nums)):
                if nums[i] != i:
                    return i
    
            # 情况三,末尾元素缺失
            num_list = [int(x) for x in nums]
            return num_list[len(num_list) - 1] + 1

    执行结果如下:

     虽然是一道简单题目,但是做完后,我发现,嗯,有没有那种套路啥的,或者更好的做法,于是乎,我想到了二分法,思路如下:

    解题思路:

    a.排序数组中的搜索问题,首先一定要想到二分法

    b.本题,我们按照题目意思来看,数组可以按照以下规则划分为两个部分:

      1.左子数组:nums[i]=i

      2.右子数组:nums[i]≠i

    c.缺失的数字等于“右子数组的首位元素”对应的索引;因此考虑使用二分法查找“右子数组的首位元素”

    代码如下:

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
    """
    # @Time : 2020/6/2 10:03 
    
    # @Author : ZFJ
    
    # @File : 缺失的数字.py 
    
    # @Software: PyCharm
    """
    
    
    class Solution(object):
        def missingNumber(self, nums):
            """
            :type nums: List[int]
            :rtype: int
            """
            i = 0
            j = len(nums) - 1
            while i <= j:
                m = (i + j) // 2
                if nums[m] == m:
                    i = m + 1
                else:
                    j = m - 1
            return i
  • 相关阅读:
    2016年会有感之测试解决方案
    APP测试走过的那些坑
    2016年终总结——测试基础篇(二)
    2016年终总结——测试基础篇(一)
    分享篇——我的Java学习路线
    selenium使用笔记(三)——元素定位
    selenium使用笔记(二)——Tesseract OCR
    selenium使用笔记(一)——selenium你该知道的
    对新手学习自动化的一些感想
    Maven的配置和使用(三)
  • 原文地址:https://www.cnblogs.com/ZFJ1094038955/p/13030004.html
Copyright © 2020-2023  润新知