每日一題——Python實現PAT乙級1050 螺旋矩陣(舉一反三+思想解讀+逐步優化)6千字好文


一個認為一切根源都是“自己不夠強”的INTJ

個人主頁:用哲學編程-CSDN博客
專欄:每日一題——舉一反三
Python編程學習
Python內置函數

Python-3.12.0文檔解讀

目錄

我的寫法

時間復雜度分析

空間復雜度分析

總結

我要更強

代碼解釋

時間復雜度

空間復雜度

總結

哲學和編程思想

哲學思想

編程思想

總結

舉一反三

1. 模塊化設計

2. 抽象化

3. 迭代與遞歸

4. 算法優化

5. 數據結構選擇

6. 邊界條件處理

7. 簡約主義

8. 秩序與結構


題目鏈接:https://pintia.cn/problem-sets/994805260223102976/exam/problems/type/7?problemSetProblemId=994805275146436608&page=0

我的寫法

import math# 讀取矩陣元素的數量
N = int(input())
# 讀取數字列表并按降序排序
nums = list(map(int, input().split()))
nums.sort(reverse=True)def find_dimensions(N):# 找到最接近N的平方根的整數middle = math.isqrt(N)# 從middle開始向上找,直到找到兩個數乘積為Nfor i in range(middle, N+1):for j in range(middle, 0, -1):if i * j == N:return i, jdef create_spiral_matrix(N, nums, m, n, seq_paces):# 初始化矩陣matrix = [[0 for i in range(n)] for j in range(m)]index_matrix = [0, -1]  # 矩陣索引初始位置index_nums = 0  # 數字列表索引for i in range(len(seq_paces)):if i % 4 == 0:  # 向右移動seq_paces[i]步index_matrix[1] += 1for j in range(seq_paces[i]):matrix[index_matrix[0]][index_matrix[1] + j] = nums[index_nums]if j == seq_paces[i] - 1:index_matrix[1] = index_matrix[1] + jindex_nums += 1elif i % 4 == 1:  # 向下移動seq_paces[i]步index_matrix[0] += 1for j in range(seq_paces[i]):matrix[index_matrix[0] + j][index_matrix[1]] = nums[index_nums]if j == seq_paces[i] - 1:index_matrix[0] = index_matrix[0] + jindex_nums += 1elif i % 4 == 2:  # 向左移動seq_paces[i]步index_matrix[1] -= 1for j in range(seq_paces[i]):matrix[index_matrix[0]][index_matrix[1] - j] = nums[index_nums]if j == seq_paces[i] - 1:index_matrix[1] = index_matrix[1] - jindex_nums += 1elif i % 4 == 3:  # 向上移動seq_paces[i]步index_matrix[0] -= 1for j in range(seq_paces[i]):matrix[index_matrix[0] - j][index_matrix[1]] = nums[index_nums]if j == seq_paces[i] - 1:index_matrix[0] = index_matrix[0] - jindex_nums += 1return matrixdef calculate_sequence_paces(N, m, n):# 計算螺旋填充的步數序列if m == 1:return [n]elif n == 1:return [1, m - 1]seq_paces = []dif = 0for i in range(N):if i == 0:seq_paces.append(n)dif += 1continueif i % 2 == 1:seq_paces.append(m - dif)elif i % 2 == 0:seq_paces.append(n - dif)dif += 1if seq_paces[-1] == 0:return seq_paces[:-1]return seq_paces# 找到矩陣的維度
m, n = find_dimensions(N)
# 計算螺旋填充的步數序列
seq_paces = calculate_sequence_paces(N, m, n)
# 創建螺旋矩陣
matrix = create_spiral_matrix(N, nums, m, n, seq_paces)
# 輸出矩陣
for row in matrix:print(*row)

時間復雜度分析

  • 排序:對?N?個數字進行排序的時間復雜度是?O(N log N)。
  • find_dimensions:這個函數在最壞情況下需要檢查大約?sqrt(N)?個可能的行和列組合,因此時間復雜度大約是?O(N)。
  • calculate_sequence_paces:這個函數在最壞情況下需要遍歷?N?次,時間復雜度也是?O(N)。
  • create_spiral_matrix:這個函數需要遍歷所有步數序列,步數序列的長度大約是?sqrt(N),每次填充矩陣的時間復雜度是?O(N),所以總時間復雜度也是?O(N)。

綜合來看,主要的時間消耗來自于排序和矩陣填充,因此總時間復雜度是 O(N log N)。

空間復雜度分析

  • 排序:排序需要的額外空間復雜度是?O(N)。
  • 矩陣:矩陣的大小是?O(N)。
  • 步數序列:步數序列的大小大約是?sqrt(N)。

綜合來看,主要的空間消耗來自于矩陣和排序,因此總空間復雜度是 O(N)。

總結

這段代碼在功能上實現了將一組數字按螺旋順序填充到矩陣中,并且在時間和空間復雜度上都是高效的。代碼結構清晰,函數職責明確,易于理解和維護。主要的時間消耗來自于排序和矩陣填充,而空間消耗主要由矩陣和排序決定。總體來說,這是一段設計良好且高效的代碼。

我要更強

為了解決這個問題,我們需要完成以下步驟:

  1. 讀取輸入的數字數量?N?和數字列表。
  2. 對數字列表進行降序排序。
  3. 找到滿足?m * n = N?且?m >= n?的矩陣維度?m?和?n,并且使得?m - n?最小。
  4. 創建一個空的螺旋矩陣,并按照順時針方向填充數字。
  5. 輸出填充好的螺旋矩陣。

以下是實現上述步驟的Python代碼:

import math# 讀取輸入
N = int(input())
nums = list(map(int, input().split()))# 對數字列表進行降序排序
nums.sort(reverse=True)# 找到合適的矩陣維度
def find_dimensions(N):min_diff = float('inf')m, n = 0, 0for i in range(1, int(math.sqrt(N)) + 1):if N % i == 0:j = N // iif j >= i and j - i < min_diff:min_diff = j - im, n = j, ireturn m, nm, n = find_dimensions(N)# 創建并填充螺旋矩陣
matrix = [[0] * n for _ in range(m)]
top, bottom, left, right = 0, m - 1, 0, n - 1
index = 0while top <= bottom and left <= right:# 向右填充for i in range(left, right + 1):matrix[top][i] = nums[index]index += 1top += 1# 向下填充for i in range(top, bottom + 1):matrix[i][right] = nums[index]index += 1right -= 1# 向左填充if top <= bottom:for i in range(right, left - 1, -1):matrix[bottom][i] = nums[index]index += 1bottom -= 1# 向上填充if left <= right:for i in range(bottom, top - 1, -1):matrix[i][left] = nums[index]index += 1left += 1# 輸出螺旋矩陣
for row in matrix:print(' '.join(map(str, row)))

代碼解釋

  1. 輸入讀取:首先讀取輸入的數字數量?N?和數字列表?nums。
  2. 排序:對數字列表?nums?進行降序排序。
  3. 找到矩陣維度:定義?find_dimensions?函數來找到合適的矩陣維度?m?和?n,使得?m * n = N?且?m >= n,并且?m - n?最小。
  4. 填充矩陣:創建一個空的矩陣?matrix,并使用邊界指針(top,?bottom,?left,?right)來控制填充方向,按照順時針方向填充數字。
  5. 輸出矩陣:最后,輸出填充好的螺旋矩陣。

這個代碼在時間和空間復雜度上都是高效的,并且能夠正確地解決給定的問題。

代碼結構和邏輯

  1. 輸入處理:代碼首先讀取輸入的數字數量 N 和數字列表 nums,這一部分的時間復雜度是 O(N),因為需要讀取和存儲 N 個數字。
  2. 排序:對數字列表 nums 進行降序排序,使用的是 Python 內置的 sort 方法,其時間復雜度是 O(N log N)。
  3. 找到矩陣維度:定義 find_dimensions 函數來找到合適的矩陣維度 m 和 n。這個函數的時間復雜度是 O(sqrt(N)),因為它只需要遍歷到 sqrt(N) 的整數。
  4. 填充矩陣:創建一個空的矩陣 matrix,并使用邊界指針(top, bottom, left, right)來控制填充方向,按照順時針方向填充數字。這一部分的時間復雜度是 O(N),因為每個數字只被處理一次。
  5. 輸出矩陣:最后,輸出填充好的螺旋矩陣。這一部分的時間復雜度也是 O(N),因為需要遍歷并輸出每個元素。

時間復雜度

綜合以上分析,主要的時間消耗來自于排序和矩陣填充。因此,總的時間復雜度是 O(N log N)。

空間復雜度

  1. 輸入存儲:需要存儲?N?個數字,空間復雜度是?O(N)。
  2. 排序:排序過程中需要額外的空間,但由于 Python 的?sort?方法是原地排序,所以這部分的空間復雜度可以忽略不計。
  3. 矩陣存儲:需要存儲一個?m * n?的矩陣,空間復雜度是?O(N)。

因此,總的空間復雜度是 O(N)。

總結

這段代碼在功能上實現了將一組數字按螺旋順序填充到矩陣中,并且在時間和空間復雜度上都是高效的。代碼結構清晰,函數職責明確,易于理解和維護。主要的時間消耗來自于排序和矩陣填充,而空間消耗主要由矩陣和輸入數據決定。總體來說,這是一段設計良好且高效的代碼。


哲學和編程思想

這段代碼體現了多個哲學和編程思想,以下是一些主要的思想:

哲學思想

  1. 秩序與結構:哲學上,秩序和結構是宇宙的基本原則。這段代碼通過將無序的數字列表轉換為有序的螺旋矩陣,體現了對秩序和結構的追求。
  2. 簡約主義:代碼盡量保持簡潔和高效,避免不必要的復雜性。這種簡約主義的思想在代碼的結構和邏輯中得到了體現。

編程思想

  1. 模塊化:代碼被劃分為多個函數,每個函數負責一個特定的任務(如輸入處理、排序、找到矩陣維度、填充矩陣和輸出矩陣)。這種模塊化的設計使得代碼更易于理解和維護。
  2. 抽象化:通過定義 find_dimensions 函數來抽象出找到矩陣維度的邏輯,使得主邏輯更加簡潔。這種抽象化的思想有助于隱藏復雜性,提高代碼的可讀性。
  3. 迭代與遞歸:雖然代碼中沒有顯式的遞歸,但通過邊界指針的迭代方式來填充矩陣,體現了迭代思想。迭代是一種逐步推進的解決問題的方法,適用于處理有序數據。
  4. 算法優化:在找到矩陣維度的過程中,代碼通過遍歷到 sqrt(N) 的整數來減少計算量,體現了算法優化的思想。這種優化減少了不必要的計算,提高了效率。
  5. 數據結構選擇:代碼選擇了列表和二維列表(矩陣)作為主要的數據結構,這種選擇是基于問題的需求和數據結構的特性。合理選擇數據結構是編程中的重要思想。
  6. 邊界條件處理:在填充矩陣的過程中,代碼通過邊界指針來控制填充方向,并處理邊界條件。這種對邊界條件的細致處理是編程中的重要思想,有助于避免錯誤和提高代碼的健壯性。

總結

這段代碼體現了秩序與結構、簡約主義等哲學思想,以及模塊化、抽象化、迭代與遞歸、算法優化、數據結構選擇和邊界條件處理等編程思想。這些思想的綜合運用使得代碼既高效又易于理解和維護。


舉一反三

結合上述的哲學和編程思想,以下是一些技巧,可以幫助你舉一反三,將這些思想應用到其他編程問題中:

1. 模塊化設計

  • 技巧:將復雜問題分解為更小的、可管理的部分。每個部分都應該有一個清晰的目的和接口。
  • 應用:在處理大型項目或復雜算法時,嘗試將功能分解為獨立的函數或類,每個部分負責一個具體的任務。

2. 抽象化

  • 技巧:識別和抽象出問題中的通用模式或邏輯,將其封裝為可重用的組件。
  • 應用:在編寫代碼時,思考哪些部分是通用的,可以被抽象出來,以便在其他地方重用。

3. 迭代與遞歸

  • 技巧:根據問題的性質選擇合適的迭代或遞歸方法。迭代通常更直觀,而遞歸在處理樹狀或嵌套結構時更自然。
  • 應用:在解決需要逐步推進或處理層次結構的問題時,考慮使用迭代或遞歸方法。

4. 算法優化

  • 技巧:始終尋找減少計算量和提高效率的方法。這可能包括使用更高效的數據結構、減少不必要的計算或利用問題的特性。
  • 應用:在設計算法時,思考如何利用問題的特性來優化性能,例如通過預處理、緩存或選擇合適的算法策略。

5. 數據結構選擇

  • 技巧:根據問題的需求選擇合適的數據結構。理解不同數據結構的優缺點,并根據訪問模式和操作需求做出選擇。
  • 應用:在解決需要頻繁查找、插入或刪除操作的問題時,考慮使用哈希表、樹或鏈表等數據結構。

6. 邊界條件處理

  • 技巧:在編寫代碼時,始終考慮邊界條件和異常情況。確保代碼在這些情況下也能正確運行。
  • 應用:在編寫循環、遞歸或處理輸入數據時,特別注意邊界條件,確保代碼的健壯性。

7. 簡約主義

  • 技巧:保持代碼簡潔和清晰。避免過度工程化和不必要的復雜性。
  • 應用:在編寫代碼時,盡量使用簡單直接的解決方案,避免引入不必要的抽象或復雜邏輯。

8. 秩序與結構

  • 技巧:在解決問題時,考慮如何引入秩序和結構,使問題更易于理解和處理。
  • 應用:在處理無序數據或復雜邏輯時,思考如何通過排序、分組或層次化來引入秩序和結構。

通過將這些技巧應用到你的編程實踐中,你將能夠更有效地解決問題,并提高代碼的質量和可維護性。記住,編程不僅僅是編寫代碼,更是關于如何思考和解決問題。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/38572.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/38572.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/38572.shtml

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

相關文章

小區服務前臺小程序的設計

管理員賬戶功能包括&#xff1a;系統首頁&#xff0c;個人中心&#xff0c;住戶管理&#xff0c;管理員管理&#xff0c;員工管理&#xff0c;安保管理&#xff0c;安保分配管理&#xff0c;客服聊天管理 微信端賬號功能包括&#xff1a;系統首頁&#xff0c;公告&#xff0c;…

Mongodb集群中的分布式讀寫

學習mongodb&#xff0c;體會mongodb的每一個使用細節&#xff0c;歡迎閱讀威贊的文章。這是威贊發布的第81篇mongodb技術文章&#xff0c;歡迎瀏覽本專欄威贊發布的其他文章。如果您認為我的文章對您有幫助或者解決您的問題&#xff0c;歡迎在文章下面點個贊&#xff0c;或者關…

互聯網摸魚日報(2024-07-01)

互聯網摸魚日報(2024-07-01) 36氪新聞 最前線 | 孚能科技廣州基地投產&#xff0c;年產能30GWh&#xff0c;主推SPS大軟包產品 本周雙碳大事&#xff1a;800億元“風光火儲”大項目來了&#xff1b;光伏巨頭SolarEdge股價驟跌20%&#xff1b;韓國電池廠大火&#xff0c;鋰電安…

目標檢測算法的優缺點

目標檢測算法在計算機視覺領域具有廣泛的應用&#xff0c;其優缺點因算法類型和具體實現而有所不同。以下是對一些主流目標檢測算法優缺點的概述&#xff1a; 1. 傳統目標檢測算法 優點&#xff1a; 模型簡單&#xff1a;傳統目標檢測算法通常基于手工設計的特征和分類器&am…

Java進階學習|Day3.Java集合類(容器),Stream的使用,哈希初接觸

java集合類&#xff08;容器&#xff09; Java中的集合類主要由Collection和Map這兩個接口派生而出&#xff0c;其中Collection接口又派生出三個子接口&#xff0c;分別是Set、List、Queue。所有的Java集合類&#xff0c;都是Set、List、Queue、Map這四個接口的實現類&#xf…

Powershell 簡易爬蟲,提取種子網站的磁力鏈接

目錄 一. 需求二. 分析2.1 思路分析2.2 技術點 三. 代碼四. 效果 一. 需求 ?有網站如下所示&#xff0c;先要求從按照關鍵詞搜索到的網頁中&#xff0c;提取出所有的磁力鏈接。 二. 分析 2.1 思路分析 打開網頁之后&#xff0c;從網頁中先提取出所有的標題相關的url然后再打…

linux驅動部分內容整理

文章目錄 Linux驅動概念應用程序調用驅動程序流程驅動模塊的加載linux設備號加載和卸載注冊新字符設備注冊設備節點自動創建設備節點編譯編譯驅動程序編譯應用程序 地址映射ioctrl命令碼的解析 并發與競爭原子操作自旋鎖信號量互斥體 linux中斷DMA映射其它printkmemcpyvolatile…

如何在ubuntu上安裝ros-noetic?

如何在ubuntu上安裝ros-noetic&#xff1f; 1. 源由2. 快速安裝3. ROS學習 1. 源由 圍繞ros-noetic這個系統&#xff0c;前面已經有不少談及&#xff1a; Linux 35.5 JetPack v5.1.3ros-noetic安裝Linux 35.5 JetPack v5.1.3Fast-Planner編譯安裝Linux 35.5 JetPack v5.1.…

RocketMQ常用基本操作

文章中的rabbitmq使用的是rocketmq-all-5.1.3-bin-release版本&#xff0c;需要安裝包的可自行下載 RockerMQ啟動停止命令 啟動命令 nohup sh bin/mqnamesrv & nohup sh bin/mqbroker -n localhost:9876 --enable-proxy & 查看日志 tail -f ~/logs/rocketmqlogs/…

多線程編程的挑戰與解決方案

多線程編程的挑戰與解決方案 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 1. 多線程編程的挑戰 在現代軟件開發中&#xff0c;多線程編程成為處理并發任務…

PatchTST創新點

這篇論文的創新點主要集中在PatchTST模型的設計和應用中。以下是對其創新點的詳細說明&#xff1a; 創新點 頻道獨立補丁設計&#xff1a;PatchTST模型通過將多變量時間序列分割成不同的頻道&#xff0c;每個頻道作為單變量時間序列處理。每個頻道獨立地通過實例歸一化操作和補…

明星中藥企業系列洞察(九)一手好牌打的稀爛!近500年老字號鎖定退市,太安堂為何“塌房”了?

近日&#xff0c;太安堂發布公告稱&#xff0c;公司已收到深交所下發的《關于廣東太安堂藥業股份有限公司股票終止上市的決定》&#xff0c;深交所決定終止公司股票上市&#xff0c;預計其最后交易日期為7月4日。太安堂曾作為國內知名的中成藥上市公司之一&#xff0c;是國家級…

matlab仿真 通信信號和系統分析(上)

&#xff08;內容源自詳解MATLAB&#xff0f;SIMULINK 通信系統建模與仿真 劉學勇編著第三章內容&#xff0c;有興趣的讀者請閱讀原書&#xff09; 一、求離散信號卷積和 主要還是使用卷積函數conv&#xff0c;值得注意的是&#xff0c;得到的卷積和長度結果為81&#xff0…

node.js+uniapp(vue),阿里云短信驗證碼

reg.vue: 思路是&#xff1a;前端調用獲取驗證碼的接口 > 后端生成驗證碼返回給前端 > 前端渲染驗證碼 <template> <div> <input class"sl-input" v-model"phone" type"tel" maxlength"11" placeholder"手…

微信小程序畢業設計-微信食堂線上訂餐系統項目開發實戰(附源碼+論文)

大家好&#xff01;我是程序猿老A&#xff0c;感謝您閱讀本文&#xff0c;歡迎一鍵三連哦。 &#x1f49e;當前專欄&#xff1a;微信小程序畢業設計 精彩專欄推薦&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python畢業設計…

【在線評論】不同視角下在線評論對客戶滿意度和推薦度的影響—推文分析—2024-07-01

今天的推文主題是【在線評論】&#xff0c;重點關注可以關注第四篇&#xff0c;很全面地分析了在線評論的信息多維性。 第一篇從客戶的在線評論入手&#xff0c;將客戶消費的動機為功利、享受、社會滿足&#xff1b;第二篇是關于在線評論對消費者再次選擇同一家酒店的機制探索…

MySQL之主從同步、分庫分表

1、主從同步的原理 MySQL主從復制的核心是二進制日志 二進制日志&#xff08;binlog&#xff09;記錄了所有DDL語句和DML語句&#xff0c;但不包括數據查詢&#xff08;select、show&#xff09;語句。 1.1、復制分三步 master主庫在事務提交時&#xff0c;會把數據變更記錄…

電子戰學習筆記01:電子戰概論

0、寫在文前 本人在學習電子戰相關理論知識時&#xff0c;一直感覺無從下手&#xff0c;之后在老師的推薦下購買了《EW101&#xff1a;電子戰基礎》紙質書籍學習&#xff0c;所以將自己的學習筆記在CSDN上記錄一下&#xff0c;也供有需要的同學參考。 1、電子戰定義 電子戰&…

Spring Boot與Apache Kafka集成的深度指南

Spring Boot與Apache Kafka集成的深度指南 大家好&#xff0c;我是免費搭建查券返利機器人省錢賺傭金就用微賺淘客系統3.0的小編&#xff0c;也是冬天不穿秋褲&#xff0c;天冷也要風度的程序猿&#xff01; 在現代分布式系統中&#xff0c;消息隊列的作用愈發重要&#xff0…

【鴻蒙學習筆記】鴻蒙ArkTS學習筆記

應用開發導讀&#xff1a;https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V5/application-dev-guide-V5 【鴻蒙培訓】第&#xff11;天?環境安裝 【鴻蒙培訓】第&#xff12;天?裝飾器?組件和頁面生命周期 【鴻蒙學習筆記】數據類型 【鴻蒙學習筆記】運算…