本體的思路:
二分查詢 因為陣列有序 查詢數字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
"""
class
count_inlist
:
def__init__
(self
,list
):
self
.list
=list
defcount_value
(self
,value
):
ifnot
self
.list
:
return
none
first
,last
,count=0
,len
(self
.list)-1
,0
##分別判斷首、尾元素是不是要找的值,
##首結點是,先讓last=first,然後last 順序增大 迴圈判斷時候依舊相等,迴圈後,last是第乙個不相等的下標,二者之間的元素個數+1即為count
ifself
.list
[first
]==value
:
last
=first
while
(self
.list
[last
]==value
):
last
+=1
iflast
>
len(
self
.list)-1
:
break
return
last
-first
##尾結點同理
ifself
.list
[last
]==value
:
first
=last
while
(self
.list
[first
]==value
):
first
-=1
iffirst
<
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,跳出
iflast
-first==1
andself
.list
[mid
]!=value
:
return
0
##中間值剛好為所尋值,則重新初始化first,last都為mid,first向左遍歷,last向右遍歷,遍歷結束後二者分別代表左、右第乙個不相等的下標,相減再-1即為count
ifself
.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
)
面試題32 數字在排序陣列中出現的次數
思路 利用二分查詢分別求出該數字在陣列中第一次和最後一次出現的位置下標 include stdafx.h include include using namespace std 找到陣列中第一次出現key的元素的下標 int binarysearchfirstkey int narr,int nle...
面試題38 數字在排序陣列中出現的次數
問題說明 1.給定排序的陣列,例如從小到大已經排序。2.給定某個查詢關鍵字,求出該關鍵字出現的次數。3.完全遍歷一遍,時間複雜度為o n 並未充分利用排序的資訊。4.需要借鑑二分查詢的思想改進,演算法的時間複雜度為o logn package com.zhang.csdn author pizi d...
面試題(3)數字在排序陣列中出現的次數
題目 統計乙個數字在排序陣列中出現的次數,例如輸入排序陣列和數字3,由於3在陣列中出現了4次,所以輸出4 思路 假設k為陣列中要統計的數字,我們可以可以確定第乙個k在陣列中出現的位置和最後乙個k在陣列中出現的位置,那麼如何確定第乙個k在陣列中出現的位置呢?我們可以先使用二分查詢的方法在陣列中找到乙個...