PongorPeo
# -*-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)    

  

分类:

技术点:

相关文章: