刷题记录-day7 (数字在升序数组中出现的次数、旋转数组的最小数字、数字序列中某一位的数字)

1.数字在升序数组中出现的次数

在这里插入图片描述

class Solution:
    def GetNumberOfK(self , data: List[int], k: int) -> int:
        # write code here
        # 两个指针,由于列表为升序,因此可以使用二分法,保证时间复杂度为nlogn
        # 每次都以中间数判断,以缩小寻找范围
        # 最后把两个指针分别指向要寻找的数的左右index
        left = 0
        right = len(data)-1
        while left <= right:
            mid = int((right+left)/2)
            if k < data[mid]:
                right = mid - 1
                continue
            elif k > data[mid]:
                left = mid + 1
                continue
            else:
                while data[left] < k:
                    left += 1
                while data[right] > k:
                    right -= 1
                return right-left+1
        return 0
        
        # 最笨的方法,代码量大,没有用指针,只用了一个值用来保存
        if not data or k > data[-1] or k < data[0]:
            return 0
        if len(data) == 1 and k == data[0]:
            return 1
        if len(data) == 1 and k != data[0]:
            return 0
        result = 0
        while len(data) > 1:
            lenght = int(len(data)/2)
            if k < data[lenght]:
                data = data[:lenght]
            elif k > data[lenght]:
                data = data[lenght:]
            elif k == data[lenght]:
                result += 1
                len_1 = lenght - 1
                lenght += 1
                while data[len_1] == k:
                    result += 1
                    if len_1 > 0:
                        len_1=len_1-1
                    else: 
                        break
                while data[lenght] == k:
                    result += 1
                    if lenght<len(data)-1:
                        lenght=lenght+1
                    else: 
                        break
                return result
        return 0

2.旋转数组的最小数字

在这里插入图片描述

class Solution:
    def minNumberInRotateArray(self , rotateArray: List[int]) -> int:
        # write code here
        # 将右端点作为比较的目标值,根据旋转数组的特点可以改变left和right指针的位置
        # 要注意一个情况需要left = mid + 1,一个情况需要right = mid,可以举例【3,4,5,1,2】且分别以5和1作为例子
        # 切记不能以左端点为比较目标,举例【1,2,3,4,5】
        left = 0
        right = len(rotateArray) - 1
        while left < right:
            mid = int((right+left)/2)
            if rotateArray[mid] > rotateArray[right]:
                left = mid + 1
                continue
            elif rotateArray[mid] < rotateArray[right]:
                right = mid
                continue
            else:
                right -= 1
                continue
        return rotateArray[left]

3. 数字序列中某一位的数字

在这里插入图片描述

class Solution:
    def findNthDigit(self , n: int) -> int:
        # write code here
        # 各个区间的下限上限是[0,10),[10, 100),[100,1000)...位数是1,2,3...
        # 从第1个区间的上限开始进行比较,如果大于上限,将上下限*10,将n=n-(上限-下限)*位数 直至找到n所在的区间
        # 找到区间后,n/位数 找到所在的数字,然后n%位数,找到数字的第几位数字
        weishu = 1
        bottom, top = 0, 10
        while n > (top-bottom)*weishu:
            n -= (top-bottom)*weishu
            bottom, top = top, top*10
            weishu += 1
        num, r = divmod(n, weishu)
        return int(str(num+bottom)[r])
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值