每日一题——Python实现蓝桥杯 单词分析(举一反三+思想解读+逐步优化)五千字好文


一个认为一切根源都是“自己不够强”的INTJ

个人主页:用哲学编程-CSDN博客
专栏:每日一题——举一反三
Python编程学习
Python内置函数

Python-3.12.0文档解读

目录

 我的写法

代码分析

时间复杂度分析

空间复杂度分析

总结

我要更强

方法一:使用 collections.Counter 优化字符计数

优化后的代码:

方法二:使用 heapq 优化排序过程

优化后的代码:

方法三:手动维护最大值优化

优化后的代码:

复杂度分析

方法一:使用 collections.Counter

方法二:使用 heapq

方法三:手动维护最大值

总结

哲学和编程思想

方法一:使用 collections.Counter

哲学和编程思想

方法二:使用 heapq

哲学和编程思想

方法三:手动维护最大值

哲学和编程思想

总结

举一反三


题目链接:https://www.lanqiao.cn/problems/504/learning/?page=1&first_category_id=1&difficulty=20&sort=students_count&asc=0

 我的写法

import os
import sys
word=input()
char_counts={}
for char in word:if char not in char_counts:char_counts[char]=1else:char_counts[char]+=1print(*sorted(char_counts.items(),key=lambda x:(-x[1],x[0]))[0],sep='\n',end='')

代码分析

  1. 输入处理:
  2. 字符计数:
  3. 排序和输出:

这部分代码首先将字典 char_counts 的键值对转换为列表,然后使用 sorted 函数按指定的规则排序。排序规则是先按出现次数的负值(即从高到低)排序,如果出现次数相同则按字符的字典序排序。最后,输出排序后的第一个元素(即出现次数最多的字符及其出现次数)。

时间复杂度分析

  • 字符计数部分:遍历输入字符串的时间复杂度是 O(n),其中 n 是输入字符串的长度。
  • 排序部分:排序的时间复杂度是 O(m log m),其中 m 是不同字符的数量。在最坏情况下,m 可能等于 n,但通常 m 远小于 n。

综合来看,整个代码的时间复杂度主要由排序部分决定,因此总体时间复杂度为 O(n + m log m)。

空间复杂度分析

  • 字符计数部分:使用了一个字典 char_counts 来存储字符及其出现次数,因此空间复杂度是 O(m),其中 m 是不同字符的数量。
  • 排序部分:排序过程中需要一个临时列表来存储字典的键值对,因此空间复杂度也是 O(m)。

综合来看,整个代码的空间复杂度为 O(m)。

总结

  • 时间复杂度:O(n + m log m)
  • 空间复杂度:O(m)

这段代码在处理大量数据时可能会受到排序操作的影响,但总体来说,它在时间和空间效率上都是合理的。


我要更强

当然,可以对这段代码进行优化。以下是几种可能的优化方式:

方法一:使用 collections.Counter 优化字符计数

collections.Counter 可以快速计算字符出现的次数,并且它的构造器是经过优化的,性能优于手动构造字典。

优化后的代码:

import collectionsword = input()
char_counts = collections.Counter(word)# 按照出现次数从高到低排序,出现次数相同时按字符字典序排序
most_common_char = sorted(char_counts.items(), key=lambda x: (-x[1], x[0]))[0]# 输出结果
print(*most_common_char, sep='\n', end='')

方法二:使用 heapq 优化排序过程

对于寻找出现次数最多的字符,可以使用堆数据结构,这样可以优化排序操作。

优化后的代码:

import collections
import heapqword = input()
char_counts = collections.Counter(word)# 使用堆来获取出现次数最多的字符
most_common_char = heapq.nlargest(1, char_counts.items(), key=lambda x: (x[1], -ord(x[0])))[0]# 输出结果
print(*most_common_char, sep='\n', end='')

方法三:手动维护最大值优化

在遍历字符串的过程中,手动维护一个最大值,这样可以避免对整个字典进行排序。

优化后的代码:

word = input()
char_counts = {}
max_char = ''
max_count = 0for char in word:if char not in char_counts:char_counts[char] = 1else:char_counts[char] += 1# 更新最大值if (char_counts[char] > max_count) or (char_counts[char] == max_count and char < max_char):max_count = char_counts[char]max_char = char# 输出结果
print(max_char, max_count, sep='\n', end='')

复杂度分析

方法一:使用 collections.Counter
  • 时间复杂度:
    • 建立 Counter 的时间复杂度是 O(n)。
    • 排序的时间复杂度是 O(m log m)。
  • 空间复杂度:O(m)
方法二:使用 heapq
  • 时间复杂度:
    • 建立 Counter 的时间复杂度是 O(n)。
    • 使用堆获取最大值的时间复杂度是 O(m log k),这里 k = 1,因此简化为 O(m)。
  • 空间复杂度:O(m)
方法三:手动维护最大值
  • 时间复杂度:整个过程只需要一次遍历字符串,时间复杂度是 O(n)。
  • 空间复杂度:O(m)

总结

  • 方法一和方法二在构建字符计数时都使用了 Counter,在处理大数据时,性能优于手动字典构建。
  • 方法二通过堆优化了排序过程,适用于需要获取前 k 个最大值的情况。
  • 方法三直接在遍历过程中维护最大值,在时间和空间复杂度上都是最优的。

可以根据具体需求选择适合的优化方案。


哲学和编程思想

在代码优化过程中,可以应用一些哲学和编程思想来设计更高效、更可读的解决方案。以下是对上述方法中使用的哲学和编程思想的详细说明:

方法一:使用 collections.Counter

哲学和编程思想
  1. 开源工具复用:
    • 哲学:不要重复发明轮子(DRY - Don't Repeat Yourself)。
    • 编程思想:利用现有的高效库和工具可以节省时间和精力,同时提高代码的性能和可靠性。collections.Counter 是一个专门用于计数的高效工具。
  2. 抽象化:
  • 哲学:将复杂的问题抽象为更简单的子问题。
  • 编程思想:通过使用高层次的抽象,如 Counter,我们可以避免手动管理计数逻辑,从而简化代码。

方法二:使用 heapq

哲学和编程思想
  1. 数据结构选择:
    • 哲学:选择最合适的数据结构解决问题。
    • 编程思想:堆是一种适合处理优先级队列的高效数据结构,能够在 O(log n) 时间内完成插入和删除操作。heapq 用于高效地找到前 k 个最大/最小元素。
  2. 分而治之:
  • 哲学:将问题分解为更小的子问题,逐一解决。
  • 编程思想:通过使用堆来处理排序问题,可以将问题分解为插入和删除操作,避免全局排序。

方法三:手动维护最大值

哲学和编程思想
  1. 原地计算(In-place Calculation):
    • 哲学:尽量减少空间占用,直接在现有数据上进行计算。
    • 编程思想:通过在遍历过程中直接维护最大值,避免了额外的空间开销和排序操作。
  2. 贪心算法:
  • 哲学:在每一步选择中做出局部最优解,从而达到全局最优解。
  • 编程思想:在每次字符计数更新时,立即检查并更新最大值,确保总是能够得到当前的全局最优解。

总结

这些优化方法利用了多种哲学和编程思想,如开源工具复用、抽象化、数据结构选择、分而治之、原地计算和贪心算法。这些思想不仅帮助我们编写高效的代码,还提高了代码的可读性和可维护性。通过理解和应用这些思想,我们可以设计出更加优雅和高效的解决方案。


举一反三

根据上述的哲学和编程思想,以下是一些具体的技巧,可以帮助将这些原则应用到其他问题中:

  1. 理解并利用现有的库和工具:在 Python 中,有很多预建的库和工具可供使用,如 collections、heapq 等。了解这些工具可以提供的功能,可以帮助你更高效地解决问题,而不必从头开始编写代码。
  2. 选择合适的数据结构:解决问题时,选择合适的数据结构是至关重要的。例如,如果你需要频繁地查找、添加或删除元素,那么可能应该选择如集合(set)或字典(dictionary)。如果需要排列或排序数据,考虑使用列表(list)或堆(heap)。
  3. 使用抽象化简化问题:试图将复杂问题抽象化,或者分解成更小的、更易于处理的部分。例如,你可以创建辅助函数来处理某些重复的任务,或者使用类(class)和对象(object)来模拟现实世界的情况。
  4. 贪心算法:在处理优化问题时,贪心算法是一种有效的策略。每次做出当前看起来最好的选择,最终可能得到全局最优解。但要注意,贪心算法并不总是能得到最优解,需要根据具体问题来分析。
  5. 原地计算:如果可能,尽量在原地进行计算,以减少额外的空间需求。例如,使用列表的索引进行操作,而不是创建新的列表。
  6. 预处理优化:在开始主要计算之前,通过预处理输入数据来简化问题或提高效率。例如,使用 Counter 进行预计数,或者对数据进行排序或分类。
  7. 复杂度分析:理解算法的时间复杂度和空间复杂度是很重要的,它可以帮助你预测代码的性能,以及是否有优化的可能性。

记住,这些只是工具和方法,应用哪种取决于具体的问题和场景。在实际编程中,需要灵活运用,甚至需要综合利用多种技巧和思想来解决问题。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1473349.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

可变参数 Collections 不可变集合 Stream流

目录 1.可变参数&#xff1a; 2.Collections: 3.不可变集合&#xff1a; 4.Stream流: 1、什么是流 2、如何生成流 1.单列集合获取Stream流 2.双列集合获取Stream流 3.数组获取Stream流&#xff1a; 4.一堆零散数据&#xff1a; Stream接口中的静态方法 3.Stream流的…

.net 调用海康SDK的跨平台解决方案

📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:新的征程,我们面对的不仅仅是技术还有人心,人心不可测,海水不可量,唯有技术,才是深沉黑夜中的一座闪烁的灯塔序言 上2篇海康SDK使用以及常见的坑…

python拆分数字

问题 从键盘获取一个4位整数&#xff0c;分别输出个位、十位、百位、千位上的数字 分析 可以使用eval()函数或者int()函数将从键盘获取的数字串转成int类型&#xff0c;通过整除和取余操作分别获取数字 numeval(input(请输入一个四位整数&#xff1a;)) print(个位数&#…

基于java+springboot+vue实现的流浪动物管理系统(文末源码+Lw)277

摘 要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff0c;对流浪动物信息管理的提升&…

Midjourney对图片细微调整和下载保存

点击v2是对第二图片细微调整。 点击u3对第3张图片进行放大。 保存图片: 对点击u3放大的图片&#xff0c;双击 , 右键保存图片

【课程总结】Day13(下):人脸识别和MTCNN模型

前言 在上一章课程【课程总结】Day13(上):使用YOLO进行目标检测,我们了解到目标检测有两种策略,一种是以YOLO为代表的策略:特征提取→切片→分类回归;另外一种是以MTCNN为代表的策略:先图像切片→特征提取→分类和回归。因此,本章内容将深入了解MTCNN模型,包括:MTC…

基于STM32F407ZG的FreeRTOS移植

1.从FreeRTOS官网中下载源码 2、简单分析FreeRTOS源码目录结构 2.1、简单分析FreeRTOS源码根目录 &#xff08;1&#xff09;Demo&#xff1a;是官方为一些单片机移植FreeRTOS的例程 &#xff08;2&#xff09;License&#xff1a;许可信息 &#xff08;3&#xff09;Sourc…

电脑f盘的数据回收站清空了能恢复吗

随着信息技术的飞速发展&#xff0c;电脑已成为我们日常生活和工作中不可或缺的设备。然而&#xff0c;数据的丢失或误删往往会给人们带来极大的困扰。尤其是当F盘的数据在回收站被清空后&#xff0c;许多人会陷入绝望&#xff0c;认为这些数据已无法挽回。但事实真的如此吗&am…

Python 学习中什么是元组,如何使用元组?

什么是元组 元组&#xff08;Tuple&#xff09;是Python内置的一种数据结构&#xff0c;用于存储多个数据项。与列表类似&#xff0c;元组也可以存储不同类型的数据&#xff0c;但它们之间存在一个重要区别&#xff1a;元组是不可变的&#xff0c;也就是说&#xff0c;一旦创建…

怀念旧的Windows声音?以下是如何在Windows 11中恢复它们

如果你渴望旧的Windows声音,希望能在Windows 11上再次听到,那你就很幸运了。我们将向你展示如何下载必要的声音包并创建复古的声音方案。 如何获取旧Windows声音的声音包 你需要做的第一件事是下载一个包含旧Windows版本声音的声音包。此外,请确保它包含的每个声音都是WAV…

ctfshow web入门 nodejs

web334 有个文件下载之后改后缀为zip加压就可以得到两个文件 一个文件类似于index.php 还有一个就是登录密码登录成功就有flag username:ctfshow password:123456因为 return name!CTFSHOW && item.username name.toUpperCase() && item.password passwor…

软件运维服务方案(Word原件2024)

软件运维服务方案&#xff08;Word原件&#xff09; 1. 服务简述 我们提供全面的软件运维服务&#xff0c;确保软件系统的稳定运行。 1.1 服务内容 包括监控、维护、故障排查与优化。 1.2 服务方式 结合远程与现场服务&#xff0c;灵活响应客户需求。 1.3 服务要求 高效响应&am…

自动驾驶AVM环视算法--相机的联合标定算法实现和exe测试demo

更新&#xff1a;测试的exe程序&#xff0c;无需解压码就可以体验算法测试效果 链接&#xff1a;https://pan.baidu.com/s/1OfuslVNcTXAZWvwiqflWsA 提取码&#xff1a;zoef 1、压缩包解压后显示如下所示 测试文件包括&#xff1a;可执行的exe文件、测试的图片等。 2.双击ex…

C++|哈希应用->布隆过滤器

目录 一、概念 二、模拟实现 三、布隆过滤器扩展应用 上一篇章学习了位图的使用&#xff0c;但它只适用于整数&#xff0c;对于要查询字符串是否在不在&#xff0c;位图并不能解决。所以针对这一问题&#xff0c;布隆过滤器可以派上用场&#xff0c;至于布隆过滤器是什么&am…

8种方案解决移动端1px边框的问题

&#x1f9d1;‍&#x1f4bb; 写在开头 点赞 收藏 学会&#x1f923;&#x1f923;&#x1f923; 8 种方案解决移动端1px边框的问题 造成边框变粗的原因 css中的1px并不等于移动设备的1px&#xff0c;这是由不同手机由不同像素密度&#xff0c;在window对象中有一个devic…

Nginx-http_auth_basic_module使用

文章目录 前言一、ngx_http_auth_basic_module二、指令1.auth_basic1.auth_basic_user_file 示例生成密码文件配置basic认证浏览器验证 总结 前言 nginx可以通过HTTP Basic Authutication协议进行用户名和密码的认证。 一、ngx_http_auth_basic_module 生效阶段&#xff1a; …

压测工具---Ultron

压测工具&#xff1a;Ultron 类型&#xff1a;接口级和全链路 接口级 对于接口级别的压测我们可以进行 http接口压测、thrift压测、redis压测、kafka压测、DDMQ压测、MySQL压测等&#xff0c;选对对应的业务线、选择好压测执行的时间和轮数就可以执行压测操作了 全链路 对…

SAP PS学习笔记01 - PS概述,创建Project和WBS

本章开始学习PS&#xff08;Project System&#xff09;。 1&#xff0c;PS的概述 PS&#xff08;Project System&#xff09;是SAP企业资源规划系统中的一个关键模块&#xff0c;主要用于项目管理。 它提供了一个全面的框架来规划、控制和执行项目&#xff0c;涵盖了从项目启…

阿秒光脉冲(阿秒脉冲)持续时间在阿秒量级 科学研究是其目前主要应用方向

阿秒光脉冲&#xff08;阿秒脉冲&#xff09;持续时间在阿秒量级 科学研究是其目前主要应用方向 阿秒光脉冲简称阿秒脉冲&#xff0c;由超级短暂的激光脉冲构成&#xff0c;单个脉冲的持续时间仅为百万亿分之一秒&#xff08;10-18秒&#xff09;。   根据新思界产业研究中心…

【JavaWeb程序设计】JSP内置对象

目录 一、通过测试以下代码&#xff0c;了解各种隐含对象与作用域变量的使用 1. request隐含对象的使用&#xff08;request.jsp&#xff09; 2. out隐含对象的使用&#xff08;out.jsp&#xff09; 3. application隐含对象的使用&#xff08;application.jsp&#xff09; …