第一次至第三次PTAJava大作業分析

付佳愉發表於2024-04-21

(1)前言:

三次題目集的知識點:
正規表示式(Regular Expression,簡稱Regex或RegExp)是一個強大的文字處理工具,用於匹配、查詢和替換字串。以下是正規表示式的主要知識點總結:

基本字元:

字面字元:表示自身的字元,如a、1、$等。
跳脫字元:使用\作為字首,如\n表示換行。
字元類:

單字元:用[ ]表示,如[abc]匹配任意一個字元a、b或c。
範圍:如[a-z]匹配任意小寫字母。
排除:使用[^ ]表示,如[^0-9]匹配任意非數字字元。
預定義字元類:

\d:匹配數字,等價於[0-9]。
\D:匹配非數字。
\w:匹配單詞字元,包括字母、數字、下劃線。
\W:匹配非單詞字元。
\s:匹配空白字元,如空格、製表符、換行符。
\S:匹配非空白字元。
數量詞:

*:零次或多次。
+:一次或多次。
?:零次或一次。
{n}:恰好n次。
{n,}:至少n次。
{n,m}:至少n次,至多m次。
邊界匹配:

^:匹配字串開始。
$:匹配字串結束。
\b:匹配單詞邊界。
\B:匹配非單詞邊界。
分組和引用:

使用( )進行分組。
\1, \2, ...:反向引用,引用之前的分組。
零寬斷言:

(?=...):正向預查。
(?!...):負向預查。
(?<=...):正向後查。
(?<!...):負向後查。
替換和捕獲:

String.replaceAll(regex, replacement):替換匹配的字串。
Pattern和Matcher類用於更復雜的字串操作和捕獲組。
匹配模式:

Pattern.CASE_INSENSITIVE:忽略大小寫。
Pattern.MULTILINE:多行模式。
Pattern.DOTALL:.匹配所有字元,包括換行符。
工具和應用:

使用線上正規表示式測試器進行除錯。
編寫單元測試以驗證正規表示式的正確性。
在程式語言中使用正規表示式庫進行字串處理。

資料型別和變數:包括基本資料型別(例如int、double、boolean等)以及變數的宣告、初始化和賦值。

運算子:包括算術運算子、比較運算子、邏輯運算子和位運算子等。

控制結構:包括條件語句(if-else)、迴圈結構(for、while、do-while)和switch-case等。

方法:包括方法的宣告、定義、呼叫、引數傳遞和返回值。

類和物件:包括類的定義、構造方法、欄位、方法和物件的建立和使用。

繼承和多型:包括繼承的基本概念、重寫、過載和多型的應用。

陣列:包括一維陣列和多維陣列的宣告、初始化和遍歷。

字串操作:包括字串的宣告、連線、分割、查詢等常見操作。

異常處理:包括try-catch-finally語句,以及常見異常型別的處理。

基本資料結構:例如列表、棧、佇列、雜湊表等資料結構的基本操作和應用。

題量:雖然題目數量不多,只有三道題,但是最後一題難度太大了,並且分數佔比很大

難度:前兩道題目難度不大,算簡單,但是最後一題的連貫性很強並且很複雜

(2)設計與分析:
下面是我第一次P他的最後一題

很抽象地把所有類放在了一個類裡面,導致我最後分不清類,也未完成作業

在這次教訓後,
我在後面的PTA作業中將類分塊放,有了一些進步,也讓我對Java這個語言的精髓有了更多的理解
以下是我第二次Java最後一個題目的程式碼
![](https://img202
4.cnblogs.com/blog/3433267/202404/3433267-20240421225954357-1257459199.png)
但是在第三次作業中,我看見題目實在很難讀懂,所以沒有花時間在最後一題的解決上
但是在寫題目過程中,我學會了很多Java的知識點:首先是對集合概念更加理解,單列集合和雙列集合,每個集合的操作,例如s.forEach(...): forEach 方法用於迭代集合 s 中的每個元素,並對每個元素執行指定的操作。
new Consumer() { ... }: 建立了一個匿名內部類實現了 Consumer 介面的例項。
public void accept(String st) { ... }: 實現了 Consumer 介面中的 accept 方法,該方法定義了對集合中每個元素的操作。
除此之外,對有無索引的概念更加清晰:有索引:

有索引通常指的是支援透過索引位置來訪問元素的資料結構,比如陣列和某些列表實現(如 ArrayList)。
對於有索引的資料結構,可以透過索引值來直接獲取或修改特定位置的元素,這樣可以在常量時間內(O(1) 時間複雜度)完成操作。
無索引:

無索引可能指的是某些資料結構或方法不支援透過索引來直接訪問元素,而是透過其他方式進行操作的情況。
例如,連結串列(如 LinkedList)通常不支援隨機訪問,而是需要從頭開始順序遍歷到目標位置才能訪問到特定的元素。這樣的操作通常需要線性時間(O(n) 時間複雜度)。
某些方法也可能不直接操作特定索引位置的元素,而是基於其他條件進行操作,例如過濾器或對映函式。
因此,區分有無索引的主要區別在於對元素的訪問方式和操作效率。有索引的資料結構通常支援快速隨機訪問,而無索引的資料結構通常需要順序訪問或者基於其他條件來操作元素
System.out.println(st);: 在 accept 方法中定義了對集合中每個元素的操作,這裡是列印每個元素。
除此之外,我還對正規表示式更加了解,在以前學習C語言的時候我常常覺得去匹配或者配對字串的方法只有遍歷然後做對比,但是透過使用正規表示式,我會覺得更加方便,例如匹配數字的開頭或者字串格式,這些工作透過使用正規表示式使得幾十分鐘的查詢和配對的事情變得幾秒鐘就能解決,大大提高了程式碼的效率和程式設計師的精力,所以我認為發明更加便捷是方式在當今AI盛行的社會下程式設計師能打敗AI的途徑之一。

(3)採坑心得:雖然我沒寫出什麼,但是我覺得要注重細節,比如輸入方法的問題,我之前一直輸入會讀入下一行的空格,但是經過同學的幫助,我發現在輸入和輸出上面都有很大y異同
除此之外,對於正規表示式的運用過程中,我發現除了匹配之外,更多的是捕捉,因此我會在接下來的學習中多運用正規表示式的一些精髓,以下是我在正規表示式中的踩坑心得貪婪匹配:預設情況下,正規表示式會盡可能匹配更長的字串。如果不想匹配最長的字串,可以使用非貪婪量詞(如*?、+?、{n,m}?)來匹配最短的字串。

特殊字元轉義:正規表示式中有些字元具有特殊含義,如.、*、+等,如果想要匹配它們的字面值,需要使用\進行轉義。

字元類的範圍:在字元類中使用範圍時要注意ASCII編碼順序,例如[A-Za-z]可以匹配大小寫字母,但[a-Z]是錯誤的範圍。

邊界匹配:使用邊界匹配符號時,如^和$,要確保它們被正確放置,否則可能導致匹配失敗或匹配到不符合預期的結果。

預定義字元類的使用:使用預定義字元類時要注意其適用範圍,如\d匹配的是數字字元,不包括符號、小數點等。

分組的優先順序:分組在正規表示式中具有優先順序,如果想要改變預設的優先順序,可以使用括號來明確分組的範圍。

正向預查和負向預查:預查是零寬度匹配,匹配的是位置而不是字元本身,要注意預查的位置和匹配內容,避免出現匹配不符合預期的情況。

效能考慮:正規表示式的效率可能會受到輸入字串的長度和複雜度的影響,需要根據實際情況進行最佳化,避免出現效能問題。

(4)改進建議:在對一些高頻率使用的方法編碼時,我認為應該建立一個單獨的類來實現,這樣不僅能更高效地解決問題,還能將程式碼簡化,大大提高了程式碼的可讀性。理解基本概念:Java是一門物件導向的程式語言,首先需要理解物件導向程式設計的基本概念,如類、物件、繼承、多型等。

掌握語法:學習Java需要熟悉其語法規則,包括變數、資料型別、運算子、流程控制語句等,這些是編寫Java程式的基礎。

程式設計實踐:透過實際程式設計專案來鞏固所學知識,可以從簡單的程式開始,逐漸增加複雜度,這有助於加深對Java程式設計的理解和掌握。

閱讀文件:Java有詳細的官方文件和教程,可以透過閱讀文件來了解Java的各種特性和API的使用方法,這對於解決問題和提高程式設計效率非常有幫助。

多練習除錯:在編寫程式碼時經常會遇到錯誤,要學會透過除錯工具找出問題並進行修復,同時要注意編寫清晰、簡潔的程式碼以提高可讀性和維護性。

(5)總結:
理解問題的本質:有時候做錯題目是因為沒有完全理解問題的要求。重溫題目,確保理解每個要求和限制條件。

仔細閱讀文件和資料:Java有很多文件和教程,重點是理解核心概念。深入閱讀文件能夠幫助更好地理解和應用Java的特性。

積極動手實踐:練習是學習的關鍵。多寫程式碼,多做練習題,透過實踐來加深對Java知識的理解和應用。

查詢和理解錯誤:當做錯題目時,不要氣餒,而是要耐心查詢錯誤並理解其原因。錯誤資訊、偵錯程式和列印語句都是很有用的工具。

學會向他人請教:有時候別人的觀點和解釋能夠幫助我們更好地理解問題。不要害羞,向老師、同學或者線上社群尋求幫助。

逐步提高難度:先從簡單的題目開始,逐漸增加難度。這樣可以建立起對基礎知識的紮實理解,並且逐步提高解決問題的能力。

保持耐心和毅力:學習程式設計是一個持續的過程,不要急於求成。保持耐心,堅持不懈,相信自己的能力。

記錄和總結:在做錯題目後,記得記錄下錯誤和正確的解法。這樣可以形成一個學習筆記,幫助鞏固知識點。