一千万条短信找重复最多前十条

算法课抽到了这样一道题,大厂面试题

有一千万条短信,有重复,以文本文件的形式保存,一行一条,有重复。请用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

这样得到的第一个记录就是出现重复次数最多的那组数字。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值