本体的思路:
二分查找 因为数组有序 查找数字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=listdefCount_Value(self,value):ifnot self.list:returnNonefirst,last,count=0,len(self.list)-1,0##分别判断首、尾元素是不是要找的值,##首结点是,先让last=first,然后last 顺序增大 循环判断时候依旧相等,循环后,last是第一个不相等的下标,二者之间的元素个数+1即为countif self.list[first]==value:last=firstwhile(self.list[last]==value):last+=1if last>len(self.list)-1:breakreturn last-first##尾结点同理if self.list[last]==value:first=lastwhile(self.list[first]==value):first-=1if first<0:breakreturn last-first##d当首尾结点都不等于是,判断d递归中间值count=self.Recurr(first,last,value)return countdef 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即为countif self.list[mid]==value:first,last=mid,midwhile(self.list[first]==value):first-=1while(self.list[last]==value):last+=1return last-first-1##若不相等,则判断中间值和所寻值的大小确认对半的范围,在新的范围内重新判断中间值和所寻值的大小(相等?不相等?)--即调用递归elif self.list[mid]>value:last=midreturn self.Recurr(first,last,value)else:first=midreturn self.Recurr(first,last,value)a=[6,7,7,7,7,7,7,7]solution=Count_InList(a)print solution.Count_Value(7)
附件列表
浙公网安备 33010602011771号