• 面试题38-数字在排序数组中出现的次数


    本体的思路:

    二分查找 因为数组有序 查找数字a在数组A中出现的次数

    特殊:

    1 数组为空

    2 数字不出现在数组中

    3 数字出现在头、尾

    4 数字刚好为中间值

    5 数字不为中间值 

    先对1 返回

    再判断对3

      如果是首,则令last=first,循环判断list[last]是否依旧等于a,相等则计数加1,不等时,若last是第一个不相等的下标,

    1. # -*- coding: utf-8 -*-
    2. """
    3. Created on Sat Feb 18 16:23:15 2017
    4. @author: zzpp220
    5. """
    6. classCount_InList:
    7.    def __init__(self,list):
    8.        self.list=list
    9.    defCount_Value(self,value):
    10.        ifnot self.list:
    11.            returnNone
    12.        first,last,count=0,len(self.list)-1,0
    13. ##分别判断首、尾元素是不是要找的值,
    14.        ##首结点是,先让last=first,然后last 顺序增大 循环判断时候依旧相等,循环后,last是第一个不相等的下标,二者之间的元素个数+1即为count
    15.        if self.list[first]==value:
    16.            last=first
    17.            while(self.list[last]==value):
    18.                last+=1
    19.                if last>len(self.list)-1:
    20.                    break  
    21.            return last-first
    22.     ##尾结点同理      
    23.        if self.list[last]==value:
    24.            first=last
    25.            while(self.list[first]==value):
    26.                first-=1
    27.                if first<0:
    28.                    break
    29.            return last-first
    30.        ##d当首尾结点都不等于是,判断d递归中间值
    31.        count=self.Recurr(first,last,value)
    32.        
    33.        return count
    34.            
    35.        
    36.    def Recurr(self,first,last,value):        
    37.        mid =(first+last)/2
    38.        ##不断的对半缩小搜索范围,最后结果是first 和last 是相邻下标,如果递归到此时依旧没有找到则说明不存在,个数为0,跳出
    39.        if last-first==1and self.list[mid]!=value:
    40.            return0
    41.            ##中间值刚好为所寻值,则重新初始化first,last都为mid,first向左遍历,last向右遍历,遍历结束后二者分别代表左、右第一个不相等的下标,相减再-1即为count
    42.        if self.list[mid]==value:
    43.            first,last=mid,mid
    44.            while(self.list[first]==value):
    45.                first-=1
    46.            while(self.list[last]==value):
    47.                last+=1
    48.            return last-first-1
    49.          ##若不相等,则判断中间值和所寻值的大小确认对半的范围,在新的范围内重新判断中间值和所寻值的大小(相等?不相等?)--即调用递归  
    50.        elif self.list[mid]>value:
    51.            last=mid
    52.            return self.Recurr(first,last,value)
    53.        else:
    54.            first=mid
    55.            return self.Recurr(first,last,value)
    56. a=[6,7,7,7,7,7,7,7]            
    57. solution=Count_InList(a)
    58. print solution.Count_Value(7)
     

    附件列表

  • 相关阅读:
    windows 查看某个端口号被占用情况
    C# 配置文件ini操作类
    C#:如何解决WebBrowser.DocumentCompleted事件的多次调用
    什么是异或_异或运算及异或运算的作用
    UID卡、CUID卡、FUID卡的区别
    C#获取窗口大小和位置坐标 GetWindowRect用法
    C#中SetWindowPos函数详解
    C#让电脑发声,播放声音
    C#自动缩进排列代码的快捷键 c# 代码重新排版 变整齐
    安卓手机USB无法共享、上网或卡顿的解决方法
  • 原文地址:https://www.cnblogs.com/zzxx-myblog/p/6421309.html
Copyright © 2020-2023  润新知