本体的思路:
二分查找 因为数组有序 查找数字a在数组A中出现的次数
特殊:
1 数组为空
2 数字不出现在数组中
3 数字出现在头、尾
4 数字刚好为中间值
5 数字不为中间值
先对1 返回
再判断对3
如果是首,则令last=first,循环判断list[last]是否依旧等于a,相等则计数加1,不等时,若last是第一个不相等的下标,
# -*- coding: utf-8 -*-
"""
Created on Sat Feb 18 16:23:15 2017
@author: zzpp220
"""
classCount_InList:
def __init__(self,list):
self.list=list
defCount_Value(self,value):
ifnot self.list:
returnNone
first,last,count=0,len(self.list)-1,0
##分别判断首、尾元素是不是要找的值,
##首结点是,先让last=first,然后last 顺序增大 循环判断时候依旧相等,循环后,last是第一个不相等的下标,二者之间的元素个数+1即为count
if self.list[first]==value:
last=first
while(self.list[last]==value):
last+=1
if last>len(self.list)-1:
break
return last-first
##尾结点同理
if self.list[last]==value:
first=last
while(self.list[first]==value):
first-=1
if first<0:
break
return last-first
##d当首尾结点都不等于是,判断d递归中间值
count=self.Recurr(first,last,value)
return count
def Recurr(self,first,last,value):
mid =(first+last)/2
##不断的对半缩小搜索范围,最后结果是first 和last 是相邻下标,如果递归到此时依旧没有找到则说明不存在,个数为0,跳出
if last-first==1and self.list[mid]!=value:
return0
##中间值刚好为所寻值,则重新初始化first,last都为mid,first向左遍历,last向右遍历,遍历结束后二者分别代表左、右第一个不相等的下标,相减再-1即为count
if self.list[mid]==value:
first,last=mid,mid
while(self.list[first]==value):
first-=1
while(self.list[last]==value):
last+=1
return last-first-1
##若不相等,则判断中间值和所寻值的大小确认对半的范围,在新的范围内重新判断中间值和所寻值的大小(相等?不相等?)--即调用递归
elif self.list[mid]>value:
last=mid
return self.Recurr(first,last,value)
else:
first=mid
return self.Recurr(first,last,value)
a=[6,7,7,7,7,7,7,7]
solution=Count_InList(a)
print solution.Count_Value(7)