每日一题——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]=1
    else:
        char_counts[char]+=1


print(*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 collections

word = 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 heapq

word = 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 = 0

for char in word:
    if char not in char_counts:
        char_counts[char] = 1
    else:
        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. 复杂度分析:理解算法的时间复杂度和空间复杂度是很重要的,它可以帮助你预测代码的性能,以及是否有优化的可能性。

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


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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

拥抱智能化,WMS系统让仓库管理精细化与人性化结合-亿发

在当今竞争激烈的市场环境中&#xff0c;仓库管理不再是简单的货物存储和流通&#xff0c;而是一个复杂而精细的管理系统。仓库管理系统&#xff08;Warehouse Management System, WMS&#xff09;作为现代仓库管理的核心技术&#xff0c;通过“有过程”的管理理念&#xff0c;…

【postgresql】数据库操作

创建数据库 使用 CREATE DATABASE SQL 语句来创建 语法&#xff1a; CREATE DATABASE dbname; 使用 createdb 命令来创建 语法&#xff1a; createdb [option...] [dbname [description]] 参数说明&#xff1a; dbname&#xff1a;要创建的数据库名。 description&…

使用gitlab的CI/CD实现logseq笔记自动发布为单页应用

使用gitlab的CI/CD实现logseq笔记自动发布为单页应用 使用gitlab的CI/CD实现logseq笔记自动发布为单页应用如何实现将logseq的笔记发布成网站使用 logseq-publish-docker 实现手动发布使用gitlab的CI/CD实现自动发布过程中的问题及解决参考资料 使用gitlab的CI/CD实现logseq笔记…

中国社科院-英国斯特灵大学双证管理学博士之英方斯特灵大学介绍

中国社科院-英国斯特灵大学双证管理学博士之英方斯特灵大学介绍 斯特灵大学&#xff08;University of Stirling&#xff09;是位于英国苏格兰斯特灵市的一所公立大学&#xff0c;1967 年以埃斯利城堡为中心建成。 斯特灵大学坚信教育的历史使命&#xff0c;开设高质、灵活的…

独家专访|格行随身WiFi创始人——刘永先 格行随身wifi如何成为行业的领跑品牌?

随着移动互联网的普及和消费者对网络依赖性的增强&#xff0c;随身WiFi市场迎来了前所未有的发展机遇。然而&#xff0c;这一市场的迅速扩张也伴随着一系列问题&#xff0c;其中最为显著的就是市场乱象丛生。近日&#xff0c;有幸邀请到行业领跑品牌格行随身WiFi的刘总&#xf…

电驱失效类型和风险分析,如何用精益思维提升电驱可靠性?

在电动车日益普及的今天&#xff0c;电驱系统作为电动车的“心脏”&#xff0c;其可靠性直接关系到整车的性能与用户体验。然而&#xff0c;电驱失效问题却一直困扰着电动车行业&#xff0c;如何提升电驱可靠性成为了业内关注的焦点。今天&#xff0c;深圳天行健精益管理咨询公…

能自动铲屎的养猫救星?带你了解热门爆款智能猫砂盆的真实体验!

在谈论猫咪的日常生活时&#xff0c;我和朋友最经常聊的话题就是在各种各样的紧急情况下如何狼狈地赶回去给猫咪铲屎&#xff0c;毕竟猫砂盆里的屎但凡停留那么几小时&#xff0c;就要开始发臭了&#xff0c;一下班回去实在受不了那个味道&#xff0c;每次下班在家门口都想带个…

深入剖析高并发服务架构设计的探索与性能分析(1)

深入剖析多线程、协程与事件驱动IO模型的探索与性能分析 Web并发应用场景网站&#xff08;Website&#xff09;并发处理场景特点复杂业务逻辑功能点与页面处理高效应对IO并发需求缓存优化处理控制 大浏览量系统的静态改造静态系统通常有如下几方面的特征几种静态化方案的设计及…

构建RAG+nebula graph(知识图谱KG)

目标&#xff1a;通过利用 LlamaIndex 和 NebulaGraph 为费城费城人队&#xff08;Philadelphia Phillies&#xff09;构建一个RAG流程&#xff0c;深入探讨知识图谱。 NebulaGraph 是市场上最好的知识图谱数据库之一。它是开源的、分布式的&#xff0c;并且能够处理具有亿万边…

Latex 绘图:Tikz 包

参考文献&#xff1a; TiKZ入门教程 - LaTeX工作室 (latexstudio.net)Latex-TiKZ绘制数学平面几何图教程_latex绘制几何图形-CSDN博客【TikZ 简单学习(上)&#xff1a;基础绘制】Latex下的绘图宏包-CSDN博客LaTeX—Tikz 宏包入门使用教程 - 知乎 (zhihu.com)Latex 实时编译 &a…

【鸿蒙学习笔记】基础组件Blank:空白填充组件

Blank&#xff1a;空白填充组件 Column({ space: 20 }) {Row() {Text(Bluetooth)Blank().color(Color.Yellow)Toggle({ type: ToggleType.Switch }).margin({ top: 14, bottom: 14, left: 6, right: 6 })}.backgroundColor(Color.Pink).borderRadius(15).padding({ left: 12 }…

矮油,希喂、喜崽、爱立方主食冻干是超贵的进口平替?最新测评

相信很多铲屎官一到选粮就苦恼&#xff0c;尤其是主食冻干&#xff0c;虽说主食冻干对猫咪的好处是普通猫粮无法比的&#xff0c;其价格也是远超普通猫粮的。所以很多铲屎官就很担心&#xff0c;花了高价买的主食冻干却营养不高。其实除了营养还有更多需要考虑的&#xff0c;比…

简述设计模式-代理模式

概述 代理模式&#xff1a;一个类代表另一个类的功能。代理模式通过引入一个代理对象来控制对员对象的访问。 举个例子&#xff0c;就像明星都有经纪公司&#xff0c;商业合作都是直接和经济公司沟通&#xff0c;不会直接和明星沟通。 律师和委托人就是代理关系&#xff0c;…

分布式技术专题 | TCP在分布式网络中的通信机制与底层实现

深入解析分布式网络中的TCP通信协议实现 跨地域通信与资源共享网络节点与主机的定义网络技术通信机制TCP/IP协议模型TCP/IP分层机制TCP的Socket链接处理控制TCP的优势和特性自动差错控制正确性和有序性 TCP的Socket使用端口在应用程序间通信TCP的Socket使用端口套接字操作 跨地…

解决Python用xpath爬取不到数据的一个思路

前言 最近在学习Python爬虫的知识&#xff0c;既然眼睛会了难免忍不住要实践一把。 不废话直接上主题 代码不复杂&#xff0c;简单的例子奉上&#xff1a; import requests from lxml import etreecookie 浏览器F12网络请求标头里有 user_agent 浏览器F12网络请求标头里有…

Facebook助力中东地区博弈游戏广告营销新视界

Facebook助力中东地区博弈游戏广告营销新视界 中东地区&#xff0c;作为世界上充满活力和潜力的游戏市场之一&#xff0c;近年来&#xff0c;Slots游戏在该地区的热度持续攀升。众多游戏开发商和广告主纷纷寻求有效的推广方式&#xff0c;以吸引更多的潜在用户。在这个过程中&…

Python--进程基础

创建进程 os.fork() 该方法只能在linux和mac os中使用&#xff0c;因为其主要基于系统的fork来实现。window中没有这个方法。 通过os.fork()方法会创建一个子进程&#xff0c;子进程的程序集为该语句下方的所有语句。 import os​​print("主进程的PID为:" , os.g…

如何利用GPT-4o生成有趣的梗图

文章目录 如何利用GPT-4o生成有趣的梗图一、引言二、使用GPT-4o生成梗图1. 提供主题2. 调用工具3. 获取图片实际案例输入输出 三、更多功能1. 创意和灵感2. 梗图知识 四、总结 如何利用GPT-4o生成有趣的梗图 梗图&#xff0c;作为互联网文化的一部分&#xff0c;已经成为了我们…

【轻量化】YOLOv8 更换骨干网络之 MobileNetv4 | 《号称最强轻量化网络》

论文地址:https://arxiv.org/pdf/2404.10518 代码地址:https://github.com/tensorflow/models/blob/master/official/vision/modeling/backbones/mobilenet.py 文章速览 文章摘要 MobileNetV4引入了一个名为Universal Inverted Bottleneck (UIB) 的新搜索模块,这个模块融合…