python实现一亿个无序数找出Top100

python实现一亿个无序数找出Top100_第1张图片


这里写目录标题

  • 一、python实现一亿个无序数找出 Top 100
    • 1、heapq.heappush详解
      • a、什么是heapq.heappush
      • b、heapq.heappush的语法
  • 二、2215. 找出两数组的不同
    • 1、集合的差集
  • 三、计算相同字符个数,并按个数排序,返回前 k 个
  • 四、返回 s2 在 s1 中的位置,要求不能使用 indexOf,并且输入任何字符串都能返回位置,如果没有,返回 0;

一、python实现一亿个无序数找出 Top 100

思路:
使用堆数据结构
1、先创建一个空的堆
2、遍历一亿个无序数,对于每个数,如果堆的大小小于100,我们将该数直接加入堆中;
3、否则,我们将该数与堆顶元素比较,如果大于堆顶元素,将堆顶元素弹出,再将该数加入堆中。
4、最后,我们将堆中的元素按照降序排序,即可得到TOP100.

1亿个数

import heapq

def find_top_100(numbers):
    heap=[]
    for num in numbers:
        if len(heap)<100:
            heapq.heappush(heap,num)
        else:
            if num > heap[0]:
                heapq.heappop(heap)
                heapq.heappush(heap,num)
    return sorted(heap,reverse=True)

# 示例用法
numbers = [1000000000 - i for i in range(100000000)]
top_100 = find_top_100(numbers)
print(top_100)

假设有1亿个数换成——》18个数,取TOP 10

import heapq

def find_top_100(numbers):
    heap=[]
    for num in numbers:
        if len(heap)<10:
            heapq.heappush(heap,num)
        else:
            if num > heap[0]:
                heapq.heappop(heap)
                heapq.heappush(heap,num)
    return sorted(heap,reverse=True)

# 示例用法
numbers = [22,61,8,42,2,6,8,52,4,3,5,17,25,31,21,44,7,12]
top_100 = find_top_100(numbers)	
print(top_100)		#[61, 52, 44, 42, 31, 25, 22, 21, 17, 12]

1、heapq.heappush详解

a、什么是heapq.heappush

在Python中,heapq模块提供了一些堆队列算法。其中一个功能是使用heappush()方法将元素添加到堆中。
堆是树状结构,其中一个结点的值不大于其父节点的值,也称为最小堆。。这意味着堆顶元素始终是堆中的最小值

b、heapq.heappush的语法

heapq.heappush(heap, item)
这个函数将item添加到heap表示的堆中。heap是由元素组成的列表或类似列表的迭代器。
这个函数会调整heap使得其仍为最小堆。

import heapq

heap = []
heapq.heappush(heap, 3)
heapq.heappush(heap, 1)
heapq.heappush(heap, 4)
heapq.heappush(heap, 2)

print("堆队列中的元素为:", end="")
for i in heap:
    print(i, end=",")

这段代码将数字3、1、4、2依次添加到heap列表中。
由于在添加元素时进行了调整,最终堆队列中的元素为1、2、4、3。

二、2215. 找出两数组的不同

简单

给你两个下标从 0 开始的整数数组 nums1 和 nums2 ,请你返回一个长度为 2 的列表 answer ,其中:
answer[0] 是 nums1 中所有 不 存在于 nums2 中的 不同 整数组成的列表。
answer[1] 是 nums2 中所有 不 存在于 nums1 中的 不同 整数组成的列表。
注意:列表中的整数可以按 任意 顺序返回。

示例 1:
输入:nums1 = [1,2,3], nums2 = [2,4,6]
输出:[[1,3],[4,6]]
解释:
对于 nums1 ,nums1[1] = 2 出现在 nums2 中下标 0 处,然而 nums1[0] = 1 和 nums1[2] = 3 没有出现在 nums2 中。因此,answer[0] = [1,3]。
对于 nums2 ,nums2[0] = 2 出现在 nums1 中下标 1 处,然而 nums2[1] = 4 和 nums2[2] = 6 没有出现在 nums2 中。因此,answer[1] = [4,6]。

示例 2:
输入:nums1 = [1,2,3,3], nums2 = [1,1,2,2]
输出:[[3],[]]
解释:
对于 nums1 ,nums1[2] 和 nums1[3] 没有出现在 nums2 中。由于 nums1[2] == nums1[3] ,二者的值只需要在 answer[0] 中出现一次,故 answer[0] = [3]。
nums2 中的每个整数都在 nums1 中出现,因此,answer[1] = [] 。

重点:集合中差集

1、集合的差集

两个集合的差集包含了第一个集合中存在,但第二个集合中不存在的所有元素。
以下是集合 s1 和 s2:

s1 = {'Python', 'Java', 'C++'}
s2 = {'C#', 'Java', 'C++'}

s1 和 s2 的差集结果只有一个元素:

s = s1 - s2

{'Python'}

因为“Python”属于第一个集合,但不属于第二个集合。

集合的差集不具有可交换性,s2 和 s1 的差集如下:

s = s2 - s1
{'C#'}

python实现一亿个无序数找出Top100_第2张图片
python实现一亿个无序数找出Top100_第3张图片
在 Python 中,我们可以使用集合的 difference() 方法或者交集操作符(-)返回两个或多个集合的差集。

from collections import Counter


class Solution(object):
    def findDifference(self, nums1, nums2):
        se1, se2 = set(nums1), set(nums2)
        return [list(se1 - se2), list(se2 - se1)]

s=Solution()

nums1 = [1,2,3,3]
nums2 = [1,1,2,2]
print(s.findDifference(nums1, nums2))

三、计算相同字符个数,并按个数排序,返回前 k 个

def func(strs,k):
    res=Counter(strs)
    res1=sorted(res.items(),key=lambda x:x[1],reverse=True)
    res2=list(map(lambda x:x[0],res1))
    return res2[:k]

strs="qweqwewt"
print(func(strs,k=2))

四、返回 s2 在 s1 中的位置,要求不能使用 indexOf,并且输入任何字符串都能返回位置,如果没有,返回 0;

def func1(s,s1):
    res=s.split(s1)
    if len(res)==1:
        return 0
    return len(res[0])


s='qweqwe'
s1='we1'
print(func1(s,s1))


python实现一亿个无序数找出Top100_第4张图片

你可能感兴趣的:(python,python面试题,python,开发语言,算法,leetcode,哈希算法,链表)