每日一题遇到沙比题目——Python实现PAT甲级1058 A+B in Hogwarts(举一反三+思想解读+逐步优化)


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

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

Python-3.12.0文档解读

目录

吐槽题目

我的写法

代码分析

1. 输入处理

2. 变量初始化

3. 查找星期几和小时

4. 查找分钟

5. 输出结果

时间复杂度

空间复杂度

总结

我要更强

优化后的代码

优化分析

时间复杂度

空间复杂度

哲学和编程思想

1. KISS(Keep It Simple, Stupid)

2. DRY(Don't Repeat Yourself)

3. 提前退出(Early Exit)

4. 最小化状态(Minimize State)

5. 空间换时间(Space-Time Tradeoff)

6. 高内聚低耦合(High Cohesion and Low Coupling)

7. 单一职责原则(Single Responsibility Principle, SRP)

8. 最小惊讶原则(Principle of Least Astonishment)

举一反三

1. 简化设计

2. 消除重复

3. 提前退出

4. 最小化状态

5. 空间换时间

6. 高内聚低耦合

7. 单一职责原则

8. 最小惊讶原则



 题目链接


吐槽题目


这道题描述有问题,小时数应该是找到第一个共有的大写字母之后的那个共有字符而不是题目所描述的第二个共有字符。让我浪费1小时,无语!!!!!

我的写法

import sys

# 读取标准输入
input = sys.stdin.read

# 去除输入数据的前后空白,并按空白字符分割成列表
data = input().strip().split()

# 将输入的四个字符串分别赋值给 first_str、second_str、third_str 和 fourth_str
first_str = data[0]
second_str = data[1]
third_str = data[2]
fourth_str = data[3]

# 初始化存储星期几、小时和分钟的变量
weekday = ""
hour = ""
minute = ""

# 定义一个列表,包含星期一到星期日的缩写
days = ["MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"]

# 布尔变量,用于指示是否已找到第一个匹配的大写字母
found_first = False

# 遍历 first_str 和 second_str 中每个字符的位置(长度取两者的最小值)
for i in range(min(len(first_str), len(second_str))):
    # 如果两个字符串在某位置的字符相同
    if first_str[i] == second_str[i]:
        # 如果还未找到第一个大写字母且该字符在 'A' 到 'G' 之间
        if not found_first and 'A' <= first_str[i] <= 'G':
            # 将 weekday 设为相应的星期几(通过 days 列表和字符的 ASCII 码计算得出)
            weekday = days[ord(first_str[i]) - ord('A')]
            # 更新 found_first 为 True
            found_first = True
        # 如果已找到第一个大写字母
        elif found_first:
            # 如果该字符是数字 '0' 到 '9' 之间,将其转换为整数并赋值给 hour
            if '0' <= first_str[i] <= '9':
                hour = int(first_str[i])
                break
            # 如果该字符是 'A' 到 'N' 之间,将其转换为对应的小时值并赋值给 hour(通过字符的 ASCII 码计算得出)
            elif 'A' <= first_str[i] <= 'N':
                hour = 10 + ord(first_str[i]) - ord('A')
                break

# 遍历 third_str 和 fourth_str 中每个字符的位置(长度取两者的最小值)
for i in range(min(len(third_str), len(fourth_str))):
    # 如果两个字符串在某位置的字符相同且该字符是字母
    if third_str[i] == fourth_str[i] and third_str[i].isalpha():
        # 将该位置的索引赋值给 minute
        minute = i
        break

# 打印结果,格式为 星期几 小时:分钟,小时和分钟都以两位数显示(不足两位的前面补零)
print(f"{weekday} {hour:02d}:{minute:02d}")

这段代码的主要功能是从四个输入字符串中解析出一个特定的时间信息,其中包括星期几、小时和分钟。代码的实现步骤包括:

  1. 读取输入数据并进行预处理。
  2. 初始化存储星期几、小时和分钟的变量。
  3. 通过遍历前两个字符串来确定星期几和小时。
  4. 通过遍历后两个字符串来确定分钟。
  5. 最终输出格式化的结果。

代码分析

1. 输入处理

python复制

input = sys.stdin.read

data = input().strip().split()

first_str = data[0]

second_str = data[1]

third_str = data[2]

fourth_str = data[3]

  • 从标准输入中读取数据,并按空白字符分割成列表形式。
  • 将列表中的四个元素分别赋值给 first_str、second_str、third_str 和 fourth_str。
2. 变量初始化

python复制

weekday =

""

hour = ""

minute = ""

days = ["MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"]

found_first = False

  • 初始化存储星期几、小时和分钟的变量。
  • 使用一个布尔变量 found_first 来指示是否已找到第一个匹配的大写字母。
  • days 列表包含星期一到星期日的缩写,对应字符 'A' 到 'G'。
3. 查找星期几和小时

python复制

for i in range(min(len(first_str), len(second_str))):

if first_str[i] == second_str[i]:

if not found_first and 'A' <= first_str[i] <= 'G':

weekday = days[ord(first_str[i]) - ord('A')]

found_first = True

elif found_first:

if '0' <= first_str[i] <= '9':

hour = int(first_str[i])

break

elif 'A' <= first_str[i] <= 'N':

hour = 10 + ord(first_str[i]) - ord('A')

break

  • 通过遍历 first_str 和 second_str,找到第一个匹配的字符并判断其是否在 'A' 到 'G' 之间以确定星期几。
  • 如果已找到第一个匹配字符,再寻找下一个匹配字符以确定小时。
4. 查找分钟

python复制

for i in range(min(len(third_str), len(fourth_str))):

if third_str[i] == fourth_str[i] and third_str[i].isalpha():

minute = i

break

  • 通过遍历 third_str 和 fourth_str,找到第一个匹配的字母以确定分钟。
5. 输出结果

python复制

print(f"{weekday} {hour:02d}:{minute:02d}")

  • 按指定格式输出结果,确保小时和分钟都以两位数显示。

时间复杂度

  • 遍历 first_str 和 second_str 的长度取决于较短的字符串长度,时间复杂度为 O(n)。
  • 遍历 third_str 和 fourth_str 的长度也是取决于较短的字符串长度,时间复杂度为 O(m)。
  • 总体时间复杂度为 O(n + m),其中 n 和 m 分别是两组字符串的最小长度。

空间复杂度

  • 变量 weekday、hour 和 minute 以及 found_first 和 days 列表占用常数空间。
  • 额外使用的空间主要是输入数据存储,假设输入数据长度为 k,则空间复杂度为 O(k)。
  • 总体空间复杂度为 O(k)。

总结

这段代码在时间复杂度和空间复杂度上都表现良好,能够高效地处理输入数据并解析出所需的时间信息。代码结构清晰,逻辑合理,适用于输入规模较大的场景。


我要更强

在这段代码中,时间复杂度和空间复杂度已经相对较优。但是,我们可以通过减少冗余操作和更精简的逻辑来进一步优化。以下是一些优化的思路:

  1. 合并变量初始化和输入读取:减少不必要的分步骤操作。
  2. 合并遍历逻辑:将查找星期几和小时的遍历合并,减少循环次数。
  3. 减少空间占用:尽可能使用局部变量和避免重复存储来减少空间复杂度。
  4. 提前终止循环:一旦找到所需的字符,即可提前退出循环,避免多余的遍历。

优化后的代码

import sys

# 读取标准输入并处理
input = sys.stdin.read().strip().split()
first_str, second_str, third_str, fourth_str = input

# 定义星期几的列表
days = ["MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"]

# 初始化变量
weekday = ""
hour = ""
minute = ""

# 用于标记是否找到了第一个大写字母
found_first = False

# 遍历 first_str 和 second_str,长度取两者的最小值
for i in range(min(len(first_str), len(second_str))):
    if first_str[i] == second_str[i]:
        if not found_first:
            if 'A' <= first_str[i] <= 'G':
                weekday = days[ord(first_str[i]) - ord('A')]
                found_first = True
        else:
            if '0' <= first_str[i] <= '9':
                hour = int(first_str[i])
                break
            elif 'A' <= first_str[i] <= 'N':
                hour = 10 + ord(first_str[i]) - ord('A')
                break

# 遍历 third_str 和 fourth_str,长度取两者的最小值
for i in range(min(len(third_str), len(fourth_str))):
    if third_str[i] == fourth_str[i] and third_str[i].isalpha():
        minute = i
        break

# 打印格式化结果
print(f"{weekday} {hour:02d}:{minute:02d}")

优化分析

时间复杂度
  • 对于查找星期几和小时的循环,时间复杂度仍然是 O(n),其中 n 是 first_str 和 second_str 的最小长度。
  • 对于查找分钟的循环,时间复杂度仍然是 O(m),其中 m 是 third_str 和 fourth_str 的最小长度。
  • 综合时间复杂度依旧是 O(n + m),但通过合并逻辑和提前终止循环,提升了实际运行效率。
空间复杂度
  • 输入数据的存储空间复杂度为 O(k),其中 k 是输入字符串的总长度。
  • 其他变量如 weekday、hour、minute 等占用常数空间。
  • 总体空间复杂度为 O(k),并没有增加额外的存储需求。

通过这些优化,减少了冗余操作,使得代码更加简洁高效。在处理大规模输入数据时,优化后的代码将更加高效。


哲学和编程思想

在这段代码的优化过程中,应用了一些重要的哲学和编程思想。以下是具体说明:

1. KISS(Keep It Simple, Stupid)

这是一种设计原则,强调简单性。简单的设计更容易理解、维护和调试。

  • 应用:通过减少不必要的分步骤操作(如合并变量初始化和输入读取),使代码更加简洁和直接。

2. DRY(Don't Repeat Yourself)

这是一个编程原则,旨在减少代码重复,提高代码的可维护性。

  • 应用:通过合并遍历逻辑,将查找星期几和小时的循环合并,避免了重复的遍历操作。

3. 提前退出(Early Exit)

这一原则建议在满足某些条件后立即退出循环或函数,以避免不必要的计算。

  • 应用:在找到所需的字符后立即退出循环,减少无效的遍历操作。

4. 最小化状态(Minimize State)

这一原则建议在程序中尽量减少需要维护的状态变量,以简化程序逻辑。

  • 应用:通过减少全局变量的使用,尽量使用局部变量,这样可以降低程序的复杂性和出错概率。

5. 空间换时间(Space-Time Tradeoff)

这一思想在算法设计中非常重要,它指出我们可以通过使用更多的空间来减少时间复杂度,反之亦然。

  • 应用:在这个优化过程中,我们通过使用局部变量减少了空间复杂度,但在时间复杂度上没有做出牺牲,因为空间换时间在这里并不适用。

6. 高内聚低耦合(High Cohesion and Low Coupling)

这一原则强调模块内部应高度相关,而模块之间的依赖应尽量减少。

  • 应用:通过将功能逻辑集中在一起(如将输入处理、变量初始化和遍历逻辑合并),提高了代码的内聚性,减少了模块间的依赖。

7. 单一职责原则(Single Responsibility Principle, SRP)

每个模块或函数应该只有一个职责或功能,这样更容易理解和维护。

  • 应用:每个循环只负责一个具体的任务(一个负责查找星期几和小时,另一个负责查找分钟),使得代码更具可读性和可维护性。

8. 最小惊讶原则(Principle of Least Astonishment)

代码应当以一种最不让人感到惊讶的方式工作,使用常见的约定和直观的方式来实现功能。

  • 应用:通过使用直观的变量名和清晰的逻辑,使得代码更容易理解,不会让读者感到困惑。

通过这些优化和编程思想的应用,代码不仅在性能上得到了提升,而且在可读性、可维护性和可靠性上也得到了增强。


举一反三

当然,可以通过理解这些编程原则,将它们灵活应用于不同的场景,来提升编程技能。以下是一些技巧,帮助你更好地举一反三:

1. 简化设计

技巧: 在设计代码时,先从最简单的方案入手,然后逐步添加复杂性。

  • 实践: 在写函数时,先写出主要逻辑,然后再考虑异常处理和边界条件。

2. 消除重复

技巧: 在编码过程中,时刻警惕重复的代码片段,考虑是否能将其抽象为函数或模块。

  • 实践: 定期审查代码,寻找重复的逻辑,并尝试将其重构为通用函数。

3. 提前退出

技巧: 在循环或判断中,一旦满足条件,就立即退出,避免不必要的计算。

  • 实践: 在编写循环和条件判断时,优先考虑提前退出策略(如return、break、continue等)。

4. 最小化状态

技巧: 尽量避免使用全局变量,优先使用局部变量,保持代码的独立性。

  • 实践: 在函数内部定义变量,确保这些变量只在函数内部使用。

5. 空间换时间

技巧: 当需要优化性能时,分析是否可以通过增加空间消耗来减少时间复杂度。

  • 实践: 在处理大数据集时,考虑使用哈希表(字典)来快速查找,提高查询速度。

6. 高内聚低耦合

技巧: 设计模块时,确保模块内部的功能高度相关,同时减少模块之间的依赖关系。

  • 实践: 使用面向对象的编程(OOP)思想,将相关功能封装到类中,并通过接口减少耦合。

7. 单一职责原则

技巧: 确保每个函数或模块只负责一项功能,避免职责过多导致代码复杂化。

  • 实践: 在编写函数时,明确函数的单一职责,并将不同功能拆分为多个小函数。

8. 最小惊讶原则

技巧: 使用常见的编程约定和清晰的命名,确保代码易于理解和维护。

  • 实践: 遵循团队的代码风格指南,使用通俗易懂的变量名和函数名。

通过这些技巧,可以在多种编程场景中灵活应用上述原则,使代码更简洁、高效、易于维护。


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

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

相关文章

系统架构设计师重难点知识脑图

大家都知道现在的软考自从变成机考后,越来越难了,教程上的内容不仅全还细,几乎任何内容都有可能考,出题老师主打一个出其不意,比如2024年5月考试,连UML时序图的片段都考,这 种如果看书的话一般都是一瞟而过,而实际工作中又很少会这么严格的去画片段。 所以对于教程上的…

悬浮翻译推荐哪个软件好?秒懂外国电影就靠它

电影如《阿甘正传》中的"Life is like a box of chocolates, you never know what youre gonna get."等台词&#xff0c;总能深深打动我们&#xff0c;超越语言的界限。 但在现实世界中&#xff0c;语言差异往往成为沟通的障碍。幸运的是&#xff0c;随着悬浮翻译器…

知识付费小程序开发搭建

一、知识付费小程序简介 知识付费小程序是一个开发知识支付的平台&#xff0c;拥有自主研发的在线课程平台&#xff0c;致力于服务知识支付行业&#xff0c;能深入每个业务场景构建完善知识付费闭环。 二、知识付费小程序的开发搭建过程 关键步骤&#xff1a; 1&#xff0c;…

【Unity性能优化】使用多边形碰撞器网格太多,性能消耗太大了怎么办

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 专栏交流&#x1f9e7;&…

AutoMQ 生态集成 Tigris

Tigris[1]是一个全球分布式的兼容 S3 的对象存储服务&#xff0c;它允许你存储和访问任意数量的数据&#xff0c;具有广泛的使用场景。Tigris 会自动且智能地将数据分布到靠近用户的位置&#xff0c;让用户无需担心数据复制和缓存复杂性。 你可以将 Tigris 用于多种场景&#x…

(文章复现)基于共享储能服务的智能楼宇双层优化配置

参考文献&#xff1a; [1]张浩鹏,李泽宁,薛屹洵,等.基于共享储能服务的智能楼宇双层优化配置[J/OL].中国电机工程学报,1-12[2024-05-22]. 1.摘要 为降低城市化进程中楼宇储能投资成本&#xff0c;提出一种基于共享储能服务的智能楼宇&#xff08;Intelligent Buildings&#…

【机器学习基础】Python编程04:五个实用练习题的解析与总结

Python是一种广泛使用的高级编程语言,它在机器学习领域中的重要性主要体现在以下几个方面: 简洁易学:Python语法简洁清晰,易于学习,使得初学者能够快速上手机器学习项目。 丰富的库支持:Python拥有大量的机器学习库,如scikit-learn、TensorFlow、Keras和PyTorch等,这些…

AIGC会带来失业潮吗?紧紧跟时代第一步,如何学习AIGC

会&#xff0c;但AI淘汰的始终是跟不上时代的人。 现在很多公司都有AI培训&#xff0c;不仅GPT&#xff0c;还有Midjourney、Stable DIffusion等一系列AI工具。 像我们公司虽然今年招的少&#xff0c;但也会对新招的应届生统一进行AI培训。 用任正非先生的话来说就是&#x…

Jupyter Notebook远程连接服务器

参考连接&#xff1a; 使用Jupyter Notebook远程连接服务器_jupyter notebook 连接 ray-CSDN博客 Jupyter Notebook 7.0 更新远程访问配置_no module named notebook.auth-CSDN博客 激活conda环境 conda activate abc #激活虚拟环境 安装jupyter pip install jupyter #安装…

Java17 --- Mabbitmq之安装测试

目录 一、拉取运行镜像 1.1、拉取镜像环境 1.2、运行镜像 二、工作模式 2.1、消息的发送者 2.2、消息的接收者 2.3、生产队列模式 2.3.1、消息的发送者 2.3.2、消息的接收者 2.4、发布订阅模式 2.4.1、消息的发送者 2.4.2、消息的接收者 2.5、路由模式 2.5.…

python --对象属性、类属性、类方法和静态方法

对象属性和类属性 --掌握--对象属性 目标掌握对象属性的使用 对象属性&#xff0c;有时也称实例属性、普通属性、公有属性 、或者直接叫属性 在类内部&#xff0c;访问对象属性语法&#xff1a; self.对象属性名 在类外部&#xff0c;访问对象属性语法&#xff1a; 对象名.对…

【全开源】安心护送非急救救护车转运平台小程序(FastAdmin+ThinkPHP+Uniap

&#x1f691;安心护送非急救救护车转运平台小程序——您的健康守护者&#x1f496; 安心护送转运平台小程序是一款基于FastAdminThinkPHPUniapp开发的非急救救护车租用转运平台小程序系统&#xff0c;可以根据运营者的业务提供类似短途接送救护服务&#xff0c;重症病人转运服…

几种近距离无线传输的方案

常见的近距离无线通信技术主要有以下几种&#xff1a; 1. 蓝牙&#xff08;Bluetooth&#xff09;&#xff1a;这是一种近距离、低功耗的无线通讯标准&#xff0c;支持设备短距离通信&#xff08;10m左右&#xff09;。常用于无线鼠标、无线键盘或手持移动终端等设备。 2. ZigB…

【权威发布丨投稿优惠】2024年企业管理、投融资与经济学国际会议(EMIFE 2024)

2024年企业管理、投融资与经济学国际会议 2024 International Conference on Enterprise Management, Investment and Financing, and Economics 【1】会议简介 2024年企业管理、投融资与经济学国际会议是一场汇集全球顶尖学者、企业家和经济学家的盛会。本次会议旨在探讨企业管…

【全开源】废品回收垃圾回收小程序APP公众号源码PHP版本

&#x1f31f;废品回收小程序&#xff1a;绿色生活的新助手&#x1f331; 一、引言 随着环保意识的逐渐提高&#xff0c;废品回收成为了我们日常生活中的重要一环。但是&#xff0c;如何更方便、高效地进行废品回收呢&#xff1f;今天&#xff0c;我要向大家推荐一款超级实用的…

线性dp+数论分块,1561D1 - Up the Strip

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 1561D1 - Up the Strip (simplified version) 二、解题报告 1、思路分析 一眼dp 写出dp方程&#xff1a; 前者维护前缀和即可O(1)转移 后者呢&#xff1f;——整除分块数论分块问题-CSDN博客 简单叙述下…

成都跃享未来教育:安全可靠,值得信赖的教育新选择

在当今社会&#xff0c;教育行业的竞争日益激烈&#xff0c;家长们对于选择一所安全可靠的教育机构显得尤为谨慎。成都跃享未来教育作为一家新兴的教育机构&#xff0c;以其独特的教育理念和优质的服务赢得了广大家长的信赖和好评。那么&#xff0c;成都跃享未来教育到底安全可…

va_start和va_end使用介绍

一 概述 采用C语言编程的时候&#xff0c;函数中形式参数的数目通常是确定的&#xff0c;在调用时要依次给出与形式参数对应的所有实际参数。但在某些情况下希望函数的参数个数可以根据需要确定。典型的例子有大家熟悉的函数printf()、scanf()和系统调用execl()等。那么它们是怎…

32C3-2模组与乐鑫ESP32­-C3­-WROOM­-02模组原理图、升级口说明

模组原理图&#xff1a; 底板原理图&#xff1a; u1 是AT通信口&#xff0c;wiif-tx wifi-rx 是升级口&#xff0c;chip-pu是reset复位口&#xff0c;GPIO9拉低复位进入下载模式 ESP32-WROOM-32 系列硬件连接管脚分配 功能 ESP32 开发板/模组管脚 其它设备管脚 下载固件…

买卖股票的各种最佳时机问题

买卖股票的最佳时机 分析 根据题意可知&#xff0c;我们只需要找出来一个最小价格的股票和一个最大价格的股票&#xff0c;并且最小价格的股票出现在最大价格的股票之前。 如果尝试使用暴力解法&#xff0c;时间复杂度为O(N^2)&#xff0c;对于题目中给的长度&#xff0c;显然…