# -*-coding:utf-8 -*-
import time
from functools import wraps
import random
def timecount(func):
\'\'\'
#时间统计
:param func:
:return:
\'\'\'
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(func.__name__, end - start)
return result
return wrapper
class Solution:
def getnumtimes(self, data, num):
\'\'\'
# 题目描述:统计一个数字在排序数组中出现的次数。
# 解题思路:通过两次二分查找,递归中直接计算k的个数
:param data:
:param num:
:return:
\'\'\'
if not data:
return 0
else:
return self.binary_chop(data, num)
@timecount
def helper(self, data, k):
\'\'\'
#双指针,加位置输出.
:param data:
:param k:
:return:
\'\'\'
if len(data) == 1:
return 1 if k in data else 0
left, right = 0, len(data) - 1
count = 0
while left < right:
if data[left] != k:
left += 1
if data[right] != k:
right -= 1
if data[left] == k and data[right] == k:
print("number place is {}-{}.".format(left+1,right+1))
return right - left + 1
return 0
@timecount
def binary_chop(self, data, num):
\'\'\'
#
:param data:
:param num:
:return:
\'\'\'
if not data:
return 0
n = len(data)
first = 0
last = n - 1
mid = int((first + last) / 2)
# print(mid)
if num > data[mid]:
return self.binary_chop(data[mid+1:], num)
elif num < data[mid]:
return self.binary_chop(data[:mid], num)
else:
# 二分法,递归统计,优化前
# count = 1 + self.binary_chop(data[:mid], num) + self.binary_chop(data[mid + 1:], num)
# return count
# 二分法,递归统计,优化数字重复较多的情况
if data[0] == num:
return mid + 1 + self.binary_chop(data[mid+1:], num)
else:
count = 1 + self.binary_chop(data[:mid], num) + self.binary_chop(data[mid+1:], num)
return count
@timecount
def randomlist(self,start, stop, length):
\'\'\'
#生成一维随机数列表
:param start:
:param stop:
:param length:
:return:
\'\'\'
rand_list = []
for i in range(length):
rand_list.append(random.randint(start, stop))
rand_list.sort()
return rand_list
#测试
s = Solution()
data = s.randomlist(0, 10, 10000000)
times2 = s.getnumtimes(data, 6)
times1 = s.helper(data, 6)
print(times2)
print(times1)