一千万条短信找重复最多前十条
算法课抽到了这样一道题,大厂面试题有一千万条短信,有重复,以文本文件的形式保存,一行一条,有重复。请用5分钟时间,找出重复出现最多的前10条我做了一简化,改为找重复最多的数字思路:先取出第一条,然后,存入变量并将此条删除,与下面的比较,遇到相同的删除,并且计数,然后,写入到另一个变量b,标题和次数;重复之,直到清空,使用排序算法对次数从大到小排序,再找回b中对应的标题,依次打印。#!/usr/bi
·
算法课抽到了这样一道题,大厂面试题
有一千万条短信,有重复,以文本文件的形式保存,一行一条,有重复。请用5分钟时间,找出重复出现最多的前10条
我做了一简化,改为找重复最多的数字
思路:先取出第一条,然后,存入变量并将此条删除,与下面的比较,遇到相同的删除,并且计数,然后,写入到另一个变量b,标题和次数;重复之,直到清空,使用排序算法对次数从大到小排序,再找回b中对应的标题,依次打印。
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:Zfy date:2021/6/8 20:05
import random
random.seed(1000)
arr = [random.randint(0,1000) for _ in range(10000)] # 随机生成一万个0到1000之间的数
b = [] # 存放数据
while len(arr) > 0:
a = arr.pop(0) # 删除第一个变量赋给新列表a
count = arr.count(a) + 1 # 计算总数
for i in range(count-1):
arr.remove(a)
b.append([a, count]) # 存起来,a为数字,count为出现次数
# 输出数字和个数
# for i in range(len(b)):
# print("{}有{}个".format(b[i][0], b[i][1]))
# 获取b中数字的个数 后面进行排序
array = []
for i in range(len(b)):
array.append(b[i][1])
array.sort(reverse=True)
# print(array)
# 打印
for n in list(reversed(list(set(array)))): # 集合去重打印
for i in range(len(b)):
if b[i][1] == n:
print("{}有{}个".format(b[i][0], n))
一万个数字运行不到一秒,如果是十万个的话需要等十几秒或者二十多秒,而且输出结果会有一点错误,可能是因为量太大了。
借鉴一种别人的方法:
思路2:首先我们将文本导入数据库,使用Having子句来实现这样的功能,
我们利用如下语句
select count(*) ccount
from table
group by messageString having count(*)>1
order by ccount desc
这样得到的第一个记录就是出现重复次数最多的那组数字。
更多推荐
已为社区贡献5条内容
所有评论(0)