每日一題——只需一行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.pswp.cn/bicheng/16729.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/16729.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/16729.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Oracle可視化性能圖表之 “CPU 內存 網絡等數據性能分析”

Oracle 性能視圖查看系統CPU 內存 磁盤 存儲等性能指標主要保存在 V$SYSMETRIC_HISTORY及DBA_HIST_SYSMETRIC_HISTORY 相關視圖上。 此次我們以網絡帶寬傳輸速率&#xff1a; 例如&#xff1a;目標是在Data Guard環境中盡可能快地傳輸和應用重做。為了實現這一點&#xff0c;…

讀人工智能時代與人類未來筆記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;發布/訂閱模式&#…

Kafka 集群部署(CentOS 單機模擬版)

0.前置說明 由于我們手里只有一臺Linux機器&#xff0c;所以我們實現的是簡單的單機模擬的集群部署&#xff0c;通過修改配置文件&#xff0c;啟動 3 個 kafka 時用到 3 個不同的端口&#xff08;9091&#xff0c;9092&#xff0c;9093&#xff09;。 1.安裝Java11 切換到你…

鏈接庫文件體積優化工具篇:bloaty

筆者之前參與過一個嵌入式智能手表項目&#xff0c;曾經碰到過這樣一個問題&#xff1a;手表的flash大小只有2M&#xff0c;這意味著只能在上面燒錄2M大小的代碼。隨著開發不斷進行&#xff0c;代碼越寫越多&#xff0c;編譯出來的bin也越來越大。最后bin大小超過了2M, 就沒法燒…

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;的研究結果和重要結論做一下梳理和匯總。為了能給出針對性的技術方案&…

Redis和MySQL的結合方式

Redis和MySQL的結合方式可以多樣化&#xff0c;以滿足不同的應用需求。以下是幾種常見的結合方式&#xff0c;以及它們的特點和適用場景&#xff1a; 緩存數據庫查詢結果&#xff1a; 應用程序首先嘗試從Redis中查詢數據。如果Redis中沒有所需數據&#xff0c;則從MySQL數據庫中…

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…

【Vue】組件用法

【前言】 … 【目標】 1 了解組件間傳參 2 組件間自定義事件綁定與解綁 3 組件的事件總線,消息訂閱與發布的用法 4 組件插槽 一 組件間傳參 #mermaid-svg-CAQFgxRrMK5KRFOr {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#merma…

機頂盒也可以跑量--上機指南

一、背景介紹 隨著科技的進步和智能設備的普及&#xff0c;機頂盒已不再是單純的電視接收器&#xff0c;而是逐漸演變成為家庭娛樂中心。越來越多的機頂盒支持各種應用、游戲和功能&#xff0c;使得用戶可以在大屏幕上享受更多樣化的內容。本指南將帶你深入了解如何讓你的機頂…

Spring中如何配置和使用Properties文件?

在Spring框架中&#xff0c;.properties 文件通常用于存儲配置信息&#xff0c;如數據庫連接、服務地址、應用參數等。以下是配置和使用 Properties 文件的詳細步驟&#xff1a; 1. 創建 Properties 文件 在項目的 src/main/resources 目錄下創建一個 .properties 文件&#…

價格預言機領導者 Pyth 與 Eclipse 平臺集成,為高頻 DeFi 應用提供支持

本篇文章將對這一戰略合作伙伴關系&#xff0c;以及 Pyth 網絡在 Eclipse 生態系統中扮演的關鍵角色進行深入探討。 目前&#xff0c;Pyth 價格數據已正式上線于 Eclipse 測試網。Eclipse 是首個結合了以太坊安全性、Solana 性能和 Celestia DA 的 Solana虛擬機(SVM) Layer2 方…

Key Chain has stopped 是什么

Key Chain has stopped 是一個特定的錯誤消息&#xff0c;通常出現在Android設備上。這個錯誤提示意味著設備上的“Key Chain”服務出現了問題&#xff0c;Key Chain服務在Android中負責管理設備的安全密鑰和證書&#xff0c;包括用戶的隱私密鑰、應用簽名密鑰等。當這個服務意…

無線麥克風哪個牌子性價比高?揭秘領夾麥克風性價比最高品牌

隨著自媒體行業的興起&#xff0c;現在視頻直播或者是個人Vlog都越來越受歡迎了&#xff0c;要想做好內容&#xff0c;除了畫面之外&#xff0c;聲音效果同樣重要。而我們手機上自帶的麥克風&#xff0c;容易受環境影響&#xff0c;特別是在戶外或者拍攝距離較遠時&#xff0c;…