面试题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)
 

 

附件列表

 

转载于:https://www.cnblogs.com/zzxx-myblog/p/6421309.html

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
相关推荐
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页