每日一题——只需一行Python秒杀:PAT乙级1009 说反话!但不能故步自封!(举一反三+思想解读+逐步优化)


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

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

Python-3.12.0文档解读

目录

我的写法

各部分功能分析:

综合时间复杂度

综合空间复杂度

总结

思路扩充

方法1: 使用双端队列

方法2: 使用栈

方法3: 使用递归

方法4: 原地反转

总结

哲学和编程思想

1. 简洁性 (Simplicity)

2. 高内聚 (High Cohesion)

3. 面向表达式编程 (Expression-Oriented Programming)

4. 函数式编程 (Functional Programming)

5. 内置函数和标准库的使用 (Leveraging Built-In Functions and Standard Library)

6. 声明式编程 (Declarative Programming)

7. 最少惊讶原则 (Principle of Least Astonishment)

8. 单一职责原则 (Single Responsibility Principle)

9. 组合模式 (Composition over Inheritance)

总结

举一反三

技巧1:简洁性 (Simplicity)

技巧2:高内聚 (High Cohesion)

技巧3:面向表达式编程 (Expression-Oriented Programming)

技巧4:函数式编程 (Functional Programming)

技巧5:声明式编程 (Declarative Programming)

技巧6:最少惊讶原则 (Principle of Least Astonishment)

技巧7:单一职责原则 (Single Responsibility Principle)

技巧8:组合模式 (Composition over Inheritance)

总结


题目链接


我的写法

print(*input().split()[::-1])


 

这段代码的功能是倒序输出用户输入的一行文本中的单词。

各部分功能分析:

  1. input():
    • 等待用户输入一行文本,并返回输入的字符串。
    • 时间复杂度:O(n),其中 n 是输入字符串的长度。
    • 空间复杂度:O(n),用于存储输入的字符串。
  2. split():
    • 将输入的字符串按照空白字符(如空格)进行分割,返回一个包含各个单词的列表。
    • 时间复杂度:O(n),需要扫描整个输入字符串。
    • 空间复杂度:O(k),其中 k 是分割后的单词列表的长度。每个单词也是从输入字符串中分割出来的,没有额外的空间分配。
  3. [::-1]:
    • 对分割后的单词列表进行逆序操作。
    • 时间复杂度:O(k),需要遍历整个列表。
    • 空间复杂度:O(k),会创建一个新的列表来存储逆序后的元素。
  4. print(*...):
  • 使用 * 运算符将列表的元素解包为单独的参数传递给 print() 函数,从而实现倒序输出每个单词。
  • 时间复杂度:O(k),需要遍历每个单词。
  • 空间复杂度:O(1),print() 本身不需要额外的空间来存储数据,但每个单词会分别传递给 print()。

综合时间复杂度

  • 输入操作:O(n)
  • 分割操作:O(n)
  • 逆序操作:O(k)
  • 打印操作:O(k)

由于 n 是输入字符串的长度,而 k 是分割后的单词数,且 k <= n,可以认为综合时间复杂度为 O(n)。

综合空间复杂度

  • 输入字符串:O(n)
  • 分割后的单词列表:O(k)
  • 逆序后的列表:O(k)

综合空间复杂度为 O(n),因为存储输入字符串是主要的空间消耗。

总结

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

这段代码非常简洁且高效地实现了倒序输出输入行中的单词。由于 Python 内置函数的高效实现,整体性能表现良好,适用于处理一般长度的输入文本。


思路扩充

有其他方法可以实现同样的功能。下面是另外几种方法,包括一些使用不同编程范式和数据结构的实现方法。虽然这些方法的时间复杂度和空间复杂度未必能显著超越原来的实现,但它们提供了不同的视角和编程技巧。

方法1: 使用双端队列

双端队列(deque)允许我们高效地在两端插入和删除元素。我们可以利用这一特性来实现反转单词的功能。

from collections import dequedef reverse_words_deque():import sysinput_line = sys.stdin.readline().strip()# 使用双端队列dq = deque()current_word = []for char in input_line:if char.isspace():if current_word:dq.appendleft(''.join(current_word))current_word = []else:current_word.append(char)if current_word:dq.appendleft(''.join(current_word))print(' '.join(dq))if __name__ == "__main__":reverse_words_deque()

方法2: 使用栈

栈的后进先出(LIFO)特性使得它非常适合这个任务。我们可以将单词依次推入栈中,然后依次弹出即可实现反转。

def reverse_words_stack():import sysinput_line = sys.stdin.readline().strip()stack = []current_word = []for char in input_line:if char.isspace():if current_word:stack.append(''.join(current_word))current_word = []else:current_word.append(char)if current_word:stack.append(''.join(current_word))while stack:print(stack.pop(), end=' ')print()if __name__ == "__main__":reverse_words_stack()

方法3: 使用递归

递归方法虽然不一定是最优的,但它提供了一种有趣的变换方式。

def reverse_words_recursive(words):if not words:returnword = words.pop()print(word, end=' ')reverse_words_recursive(words)def main_recursive():import sysinput_line = sys.stdin.readline().strip()words = input_line.split()reverse_words_recursive(words)print()if __name__ == "__main__":main_recursive()

方法4: 原地反转

如果允许修改输入字符串,可以考虑原地反转。虽然Python字符串不可变,但我们可以用列表模拟这一操作。

def reverse_words_in_place():import sysinput_line = list(sys.stdin.readline().strip())def reverse_range(lst, start, end):while start < end:lst[start], lst[end] = lst[end], lst[start]start += 1end -= 1n = len(input_line)reverse_range(input_line, 0, n - 1)start = 0for i in range(n + 1):if i == n or input_line[i].isspace():reverse_range(input_line, start, i - 1)start = i + 1print(''.join(input_line))if __name__ == "__main__":reverse_words_in_place()

总结

以上几种方法展示了如何从不同的角度实现“反转单词”的功能:

  1. 双端队列:高效的插入和删除操作。
  2. 栈:利用后进先出的特性。
  3. 递归:虽然不一定高效,但提供了另一种实现思路。
  4. 原地反转:模拟C语言风格的原地操作。

每种方法都有其独特的应用场景和优缺点。从实际应用角度看,原始代码已经足够高效,但了解不同的实现方法能帮助你在不同场景中灵活应用。


哲学和编程思想

使用这段代码解决问题不仅简洁高效,还体现了多种重要的编程哲学和思想。以下是一些关键点:

1. 简洁性 (Simplicity)

这段代码采用了Python的内置函数和操作符,直接实现了功能,非常简洁。简洁性是编程中的一大美德,代码越简洁,越容易阅读、理解和维护。

2. 高内聚 (High Cohesion)

这段代码中的每个部分都有明确的职责:input()用于读取输入,split()用于分割单词,[::-1]用于反转列表,print(*...)用于输出结果。这种高内聚性使得代码更容易理解和调试。

3. 面向表达式编程 (Expression-Oriented Programming)

Python是一种表达式导向的语言,这段代码充分利用了Python的表达式能力。通过链式调用,多个操作被组合成一个表达式,这使得代码更紧凑。

4. 函数式编程 (Functional Programming)

虽然Python不是纯粹的函数式编程语言,但这段代码展示了一些函数式编程的概念,比如:

  • 无副作用 (Side-Effect Free):代码读取输入,处理数据,然后输出结果,没有修改任何全局状态。
  • 不可变性 (Immutability):split()和[::-1]操作返回新的列表,而不是修改原列表。

5. 内置函数和标准库的使用 (Leveraging Built-In Functions and Standard Library)

Python的内置函数和标准库提供了高效且经过优化的实现。通过利用这些函数(如input(), split(), print()),我们可以减少代码量并提高执行效率。

6. 声明式编程 (Declarative Programming)

这段代码更多的是描述了“做什么”,而不是“如何做”。例如,split()描述了要把字符串拆分成单词,[::-1]描述了要反转列表,而不是手动实现这些操作。这种声明式的风格提高了代码的可读性和可维护性。

7. 最少惊讶原则 (Principle of Least Astonishment)

代码的行为符合大多数程序员的预期,没有复杂的操作和隐藏的副作用。这使得代码更容易理解和信任。

8. 单一职责原则 (Single Responsibility Principle)

这段代码的每个部分都只有一个明确的职责:读取输入、分割单词、反转列表和打印输出。这符合单一职责原则,使得代码更模块化。

9. 组合模式 (Composition over Inheritance)

虽然这段代码没有涉及到类和继承,但它展示了通过组合简单操作来构建复杂功能的方法。这种组合模式是很多现代编程的核心思想,比继承更灵活、更易于维护。

总结

这段代码通过简洁、高内聚、函数式编程和内置函数的高效使用,展示了许多编程中的重要思想和哲学。这不仅使代码易于阅读和维护,也提高了代码的执行效率。通过这些编程思想的应用,可以编写出更高质量、更可靠的代码。


举一反三

当然,理解这些编程哲学和思想并能在实际编程中灵活应用是非常有价值的。以下是一些具体的技巧和示例代码,帮助你在编写代码时能够举一反三。

技巧1:简洁性 (Simplicity)

技巧:利用Python的内置函数和简洁语法,使代码尽可能简洁。

示例:将一个字符串中的所有数字提取出来,并以列表形式返回。

# 简洁方式
def extract_digits(s):return [int(char) for char in s if char.isdigit()]# 使用示例
s = "ab12cd34"
print(extract_digits(s))  # 输出: [1, 2, 3, 4]

技巧2:高内聚 (High Cohesion)

技巧:确保每个函数或代码块只做一件事,这有助于代码的可读性和可维护性。

示例:将输入的句子转换成大写,并按单词反转。

def read_input():return input("Enter a sentence: ")def to_uppercase(s):return s.upper()def reverse_words(s):return ' '.join(s.split()[::-1])def main():sentence = read_input()uppercase_sentence = to_uppercase(sentence)reversed_sentence = reverse_words(uppercase_sentence)print(reversed_sentence)# 使用示例
if __name__ == "__main__":main()

技巧3:面向表达式编程 (Expression-Oriented Programming)

技巧:尽可能使用表达式来进行链式操作,使代码更紧凑。

示例:从一个列表中筛选出所有偶数,并将它们平方后返回。

# 面向表达式编程
def filter_and_square_evens(nums):return [x**2 for x in nums if x % 2 == 0]# 使用示例
nums = [1, 2, 3, 4, 5, 6]
print(filter_and_square_evens(nums))  # 输出: [4, 16, 36]

技巧4:函数式编程 (Functional Programming)

技巧:尽量避免副作用,使用不可变的数据结构和纯函数。

示例:对列表中的每个元素应用一个函数,并返回新的列表。

# 函数式编程
def apply_function(lst, func):return list(map(func, lst))# 使用示例
nums = [1, 2, 3, 4]
print(apply_function(nums, lambda x: x * 2))  # 输出: [2, 4, 6, 8]

技巧5:声明式编程 (Declarative Programming)

技巧:更多地描述“做什么”,而不是“如何做”。

示例:从一个字符串中提取所有的单词,并按字母顺序排序。

# 声明式编程
def extract_and_sort_words(s):return sorted(s.split())# 使用示例
s = "the quick brown fox"
print(extract_and_sort_words(s))  # 输出: ['brown', 'fox', 'quick', 'the']

技巧6:最少惊讶原则 (Principle of Least Astonishment)

技巧:编写代码时,尽量避免复杂和不易理解的逻辑,遵循常见的编程习惯。

示例:创建一个简单的计算器函数,可以进行加、减、乘、除操作。

# 最少惊讶原则
def calculator(a, b, operation):if operation == 'add':return a + belif operation == 'subtract':return a - belif operation == 'multiply':return a * belif operation == 'divide':if b != 0:return a / belse:return 'Division by zero'else:return 'Unknown operation'# 使用示例
print(calculator(10, 5, 'add'))  # 输出: 15
print(calculator(10, 5, 'divide'))  # 输出: 2.0

技巧7:单一职责原则 (Single Responsibility Principle)

技巧:每个函数或类只负责一项任务。

示例:设计一个简单的用户管理系统,每个类和函数都有明确的职责。

class User:def __init__(self, username, email):self.username = usernameself.email = emailclass UserManager:def __init__(self):self.users = []def add_user(self, user):self.users.append(user)def remove_user(self, username):self.users = [user for user in self.users if user.username != username]def get_user(self, username):for user in self.users:if user.username == username:return userreturn None# 使用示例
user1 = User('alice', 'alice@example.com')
user2 = User('bob', 'bob@example.com')manager = UserManager()
manager.add_user(user1)
manager.add_user(user2)print(manager.get_user('alice').email)  # 输出: alice@example.com
manager.remove_user('alice')
print(manager.get_user('alice'))  # 输出: None

技巧8:组合模式 (Composition over Inheritance)

技巧:通过组合简单功能来构建复杂功能,而不是通过继承来扩展功能。

示例:实现一个具有加法和乘法功能的计算器,并使用组合方式扩展新的功能。

class Adder:def add(self, a, b):return a + bclass Multiplier:def multiply(self, a, b):return a * bclass Calculator:def __init__(self, adder, multiplier):self.adder = adderself.multiplier = multiplierdef add(self, a, b):return self.adder.add(a, b)def multiply(self, a, b):return self.multiplier.multiply(a, b)# 使用示例
adder = Adder()
multiplier = Multiplier()
calculator = Calculator(adder, multiplier)print(calculator.add(3, 4))  # 输出: 7
print(calculator.multiply(3, 4))  # 输出: 12

总结

通过这些技巧和示例代码,可以更好地理解和应用编程中的重要思想和哲学。这不仅有助于写出更高效、更易维护的代码,还能提高编程技能和思维能力。


感谢阅读。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

读人工智能时代与人类未来笔记15_改变人类经验

1. 认识世界的方式 1.1. 信仰 1.2. 理性 1.2.1. 理性不仅革新了科学&#xff0c;也改变了我们的社会生活、艺术和信仰 1.2.2. 在其浸染之下&#xff0c;封建等级制度瓦解了&#xff0c;而民主&#xff0c;即理性的人应该自治的理念崛起了 1.3. 人工智能 1.3.1. 这种转变将…

大数据开发面试题【Kafka篇】

83、介绍下Kafka&#xff0c;Kafka的作用?Kafka的组件?适用场景? kafka是一个高吞吐量、可扩展的分布式消息传递系统&#xff0c;在处理实时流式数据&#xff0c;并能够保证持久性和容错性 可用于数据管道、流分析和数据继承和关键任务应用&#xff08;发布/订阅模式&#…

Vue3+Ant design 实现Select下拉框一键全选/清空

最近在做后台管理系统项目的时候&#xff0c;产品增加了一个让人非常苦恼的需求&#xff0c;让在Select选择器中添加一键全选和清空的功能&#xff0c;刚开始听到的时候真是很懵&#xff0c;他又不让在外部增加按钮&#xff0c;其实如果说在外部增加按钮实现全选或者清空的话&a…

3、python安装-linux系统下

安装前置依赖软件&#xff0c;安装完成后&#xff0c;打开官网&#xff0c;下载linux系统下的python安装包&#xff1a; 选择最新的版本 点击最新版本&#xff0c;进入版本对应的界面&#xff0c; 选择第一个进行源码的编译&#xff0c;右键选择复制连接地址&#xff0c; 回到终…

HTML+CSS+JS(web前端大作业)~致敬鸟山明简略版

HTMLCSSJS【动漫网站】网页设计期末课程大作业 web前端开发技术 web课程设计 文章目录 一、网站题目 二、网站描述 三、网站介绍 四、网站效果 五、 网站代码 文章目录 一、 网站题目 动漫网站-鸟山明-龙珠超 二、 网站描述 页面分为页头、菜单导航栏&#xff08;最好可下拉&…

CDC 数据实时同步入湖的技术、架构和方案(截至2024年5月的现状调研)

近期&#xff0c;对 “实时摄取 CDC 数据同步到数据湖” 这一技术主题作了一系列深入的研究和验证&#xff0c;目前这部分工作已经告一段落&#xff0c;本文把截止目前&#xff08;2024年5月&#xff09;的研究结果和重要结论做一下梳理和汇总。为了能给出针对性的技术方案&…

ESP32-C6接入巴法云,Arduino方式

ESP32-C6接入巴法云&#xff0c;Arduino方式 第一、ESP32-C6开发环境搭建第一步&#xff1a;安装arduino IDE 软件第二步&#xff1a;安装esp32库第三&#xff1a;arduino 软件设置 第二&#xff1a;简单AP配网程序第一步&#xff1a;程序下载第二步&#xff1a;程序使用第三步…

电脑微信群发 500 1000人以上怎么群发,微信营销群发助手软件,本人亲测,增加十倍业绩!!!

今天给大家推荐一款我们目前在使用的电脑群发工具掘金小蜜&#xff0c;不仅可以无限多开&#xff0c;方便你同时管理多个账号&#xff0c;群发功能更是十分强大&#xff0c;轻松释放你的双手。 掘金小蜜&#xff08;只支持Win7及以上操作系统&#xff0c;没有推Mac版和手机客户…

[码蹄集新手训练营]MT1016-MT1020

目录 题号MT1016 宽度与对齐MT1017 左右对齐MT1018 输入宽度MT1020 %s格式符 题号 MT1016 宽度与对齐 #include<stdio.h> int main() { printf("%-5d %5d\n%-5d %5d\n%-5d %5d",455,455,-123,-123,987654,987654);return 0; }MT1017 左右对齐 #include<s…

Mac | macOs系统安装Monuty解决外接u盘ntfs读写问题

问题 mac电脑的macOs系统无法将文件读写入外接u盘或硬盘中&#xff1b; 解决方案 安装Monuty 官网&#xff1a;mounty官网 下载软件 安装其他配置 macbook:~ uwe$ brew install --cask macfuse macbook:~ uwe$ brew install gromgit/fuse/ntfs-3g-mac macbook:~ uwe$ brew…

机顶盒也可以跑量--上机指南

一、背景介绍 随着科技的进步和智能设备的普及&#xff0c;机顶盒已不再是单纯的电视接收器&#xff0c;而是逐渐演变成为家庭娱乐中心。越来越多的机顶盒支持各种应用、游戏和功能&#xff0c;使得用户可以在大屏幕上享受更多样化的内容。本指南将带你深入了解如何让你的机顶…

价格预言机领导者 Pyth 与 Eclipse 平台集成,为高频 DeFi 应用提供支持

本篇文章将对这一战略合作伙伴关系&#xff0c;以及 Pyth 网络在 Eclipse 生态系统中扮演的关键角色进行深入探讨。 目前&#xff0c;Pyth 价格数据已正式上线于 Eclipse 测试网。Eclipse 是首个结合了以太坊安全性、Solana 性能和 Celestia DA 的 Solana虚拟机(SVM) Layer2 方…

无线麦克风哪个牌子性价比高?揭秘领夹麦克风性价比最高品牌

随着自媒体行业的兴起&#xff0c;现在视频直播或者是个人Vlog都越来越受欢迎了&#xff0c;要想做好内容&#xff0c;除了画面之外&#xff0c;声音效果同样重要。而我们手机上自带的麦克风&#xff0c;容易受环境影响&#xff0c;特别是在户外或者拍摄距离较远时&#xff0c;…

微软改进WSL子系统 新版将支持镜像宿主机网络接口及使用外部DNS

Windows SubSystem for Linux (即 WSL) 是微软在 Windows 10/11 中开发的子系统功能&#xff0c;该功能允许用户在 Windows 上安装 Linux 系统和相关环境&#xff0c;对开发者来说可以构建 Linux 开发环境进行工作。不过 WSL 系统在功能上也有不少缺点&#xff0c;典型的就是默…

【Docker实战】进入四大数据库的命令行模式

上一篇我们讲了docker exec命令&#xff0c;这一次我们使用docker exec命令来进入四大数据库的命令行模式。 我们进行游戏开发或软件开发是离不开四大数据库的&#xff0c;这四大数据库分别是关系型数据库mysql、postgres&#xff0c;nosql数据库redis、mongodb。将它们容器化…

TopK问题

前言&#xff1a;本篇对TopK问题的解答是介于堆的基础上讲的 TopK问题&#xff1a; 就是在许多数据中找到前K个最大的数据或者最小的数据 比如&#xff1a;专业前10、世界五百强、富豪榜、以及游戏排行榜等等 对于TopK问题&#xff1a;能想到的最简单直接的方式就是排序解决,…

fastadmin二次开发 修改默认的前端弹出样式

需要修改fastadmin后台默认的弹出提示样式效果&#xff1a; 在项目里搜索这个关键词&#xff1a;Toastr 首先这个文件&#xff0c;里面的success和error就是弹出提示的方法。 public/assets/js/fast.js 然后是下面这个文件&#xff1a; public/assets/js/require-form.js 你…

对于高速信号完整性,一块聊聊啊(13)

前面一篇说了有源仿真和无源仿真的区别&#xff0c;今天介绍一下前仿真和后仿真。 一个完整的电路设计中必然包含前仿真和后仿真两个部分&#xff0c;它们都属于验证的必要环节。 尤其是在复杂的芯片设计中&#xff0c;验证要占用整个芯片设计流程时间的60%-70%。目的就是尽可…

解析气膜场馆造价—轻空间

随着社会的发展和对环保及时间成本的重视&#xff0c;气膜场馆逐渐成为众多体育场馆的首选建筑模式。气膜建筑包括气膜篮球场、气膜室内足球场、气膜羽毛球场、气膜乒乓球馆、气膜网球场以及气膜滑冰场等&#xff0c;因其多项优势受到广泛应用。 气膜场馆的显著特点 1. 气膜场馆…

aosp14的分屏接口ISplitScreen接口获取方式更新-学员疑问答疑

背景&#xff1a; 有学员朋友在学习马哥的分屏pip自由窗口专题时候&#xff0c;做相关分屏做小桌面项目时候&#xff0c;因为原来课程版本是基于android 13进行的讲解的&#xff0c;但是现在公司已经开始逐渐进行相关的android 14的适配了&#xff0c;但是android 14这块相比a…