Python解决“找出整形数组中占比超过一半的数”问题

news/2025/3/7 1:51:28/

这里写目录标题

  • 问题描述
  • 测试样例
  • 解决思路
  • 代码
    • 法1
    • 法2

问题描述

小R从班级中抽取了一些同学,每位同学都会给出一个数字。已知在这些数字中,某个数字的出现次数超过了数字总数的一半。现在需要你帮助小R找到这个数字。

测试样例

样例1:
输入:array = [1, 3, 8, 2, 3, 1, 3, 3, 3]
输出:3

样例2:
输入:array = [5, 5, 5, 1, 2, 5, 5]
输出:5

样例3:
输入:array = [9, 9, 9, 9, 8, 9, 8, 8]
输出:9

解决思路

这道题目综合运用了哈希表和计数算法知识。题目要求找出数组中出现次数超过一半的数字。由于题目明确指出存在这样的数字,因此我们可以通过统计每个数字的出现次数来找到答案。使用哈希表(Python中的Counter)可以高效地统计每个数字的出现次数,然后遍历哈希表找到出现次数超过数组长度一半的数字。

统计数字出现次数:使用Counter对数组中的每个数字进行计数,生成一个哈希表,键为数字,值为该数字在数组中出现的次数。
查找超过一半的数字:遍历哈希表,找到第一个满足出现次数乘以2大于数组长度的数字,即为答案。

时间复杂度:O(n),其中n是数组的长度。我们需要遍历数组一次来统计数字的出现次数,然后再遍历哈希表一次来找到目标数字。
空间复杂度:O(n),哈希表的空间复杂度与数组中不同数字的数量成正比,最坏情况下为n。

代码

法1

根据思路逻辑解法

python">def solution(array):# 创建一个字典来记录每个数字的出现次数count_dict = {}# 遍历数组,统计每个数字的出现次数for num in array:# 如果数字已经在字典中,增加其计数if num in count_dict:count_dict[num] += 1else:# 如果数字不在字典中,初始化其计数为1count_dict[num] = 1# 找到出现次数超过数组长度一半的数字half_length = len(array) // 2for num, count in count_dict.items():if count > half_length:return num# 如果没有找到符合条件的数字,返回0(虽然题目保证一定存在这样的数字)return 0if __name__ == "__main__":# 添加你的测试用例print(solution(array = [1, 3, 8, 2, 3, 1, 3, 3, 3]))print(solution(array = [5, 5, 5, 1, 2, 5, 5]))print(solution(array = [9, 9, 9, 9, 8, 9, 8, 8]))

法2

简化方法:

python">def solution(array: list) -> int:from collections import Counterc = Counter(array)return next(k for k, v in c.items() if v * v > len(array))if __name__ == '__main__':print(solution(array = [1, 3, 8, 2, 3, 1, 3, 3, 3]) == 3)print(solution(array = [5, 5, 5, 1, 2, 5, 5]) == 5)print(solution(array = [9, 9, 9, 9, 8, 9, 8, 8]) == 9)

http://www.ppmy.cn/news/1576920.html

相关文章

MySQL -操作

博客主页:【夜泉_ly】 本文专栏:【暂无】 欢迎点赞👍收藏⭐关注❤️ 文章目录 创建数据库格式编码集 操控数据库查看数据库修改数据库删除数据库备份与还原 部分表操作创建表查看表修改表 我的版本号:8.0.41-0ubuntu0.22.04.1 创…

大模型学习笔记------Llama 3模型架构简介

大模型学习笔记------Llama 3模型架构 1、整体网络结构2、主要创新点3、其他关键改进点 LLaMA(Large Language Model Meta AI)系列模型是Meta发布并开源,分别在2023年2月、2023年7月和2024年4月发布了经历了LLaMA 1、LLaMA 2和LLaMA 3模型。本文只讲相对比较成熟、性…

(模拟 反转字符串中的单词)leetcode 151

这个题我们用一个vector<string>s1的容器存放所有的单词&#xff0c;建立string ans再倒序依次添加s[i]再添加空格返回 如何正确地讲单词存入ans? 答&#xff1a;1.使用substr提取单词 2.建立left变量 这算核心的思路了&#xff0c;详解注释看代码的解析 还有更简单的…

OCCT 学习笔记:创建瓶子教程的三个关键知识点

对OCCT已经有了多年了解&#xff0c;但时不时还是要翻一翻它的官方文档。今天重读了&#xff1a;Bottle Tutorial 教程概况 这篇教程文档围绕使用Open CASCADE Technology进行3D建模展开&#xff0c;以创建一个瓶子模型为例&#xff0c;逐步介绍建模过程及相关技术要点&#x…

376_C++_云透传,板端负责处理透传数据的API函数,用于实现客户端对设备内部接口的访问(VMS把数据直接传给板端内部)

RsApi_PassThrough 云透传,板端负责处理透传数据的API函数,用于实现客户端对设备内部接口的访问(VMS把数据直接传给板端内部) 我来分析一下 RsApi_PassThrough 函数的作用和实现逻辑: 1. 功能概述 RsApi_PassThrough 是一个透传接口,用于处理 /API/Http/PassThrough 的…

面试高频考点:一文吃透并发Concurrency与并行Parallelism

并发&#xff08;Concurrency&#xff09;和并行&#xff08;Parallelism&#xff09;是系统设计中最容易被误解的两个概念。 虽然它们听起来很相似&#xff0c;但实际上指的是处理任务的两种截然不同的方法。 简单来说&#xff0c;一个是关于同时管理&#xff08;manage&…

FPGA学习(一)——DE2-115开发板编程入级

FPGA学习&#xff08;一&#xff09;——DE2-115开发板编程入级 一、实验目的 通过 1 位全加器的详细设计&#xff0c;深入掌握原理图输入以及 Verilog 的两种设计方法&#xff0c;熟悉 Quartus II 13.0 软件的使用流程&#xff0c;以及在 Intel DE2-115 开发板上的硬件测试过…

用CLI操作MySQL 92数据库的命令

打开CLI&#xff1a; 输入数据库root密码&#xff1a; 注意&#xff1a;root密码在安装MySQL数据库时创建。需要记住。 查看数据库&#xff0c;可以参考库-表-列的顺序&#xff0c;先查看数据库库&#xff1a; show databases&#xff1b;再查看数据cfriends_db数据库中的数据…