java題目集總結

                  題目集一總結

前言:題目集一主要涉及了java程序的基本結構,編譯器的基本使用方法,基本語法。題目7-8初次介紹了類。題目數量比較少,難度較低,主要是讓咱們適應了Java的編碼習慣。java

   題目集二更進一步設計了字符串,數組的操做,3,4,5題層層遞進爲咱們引入了方法。題目中設計的方法聲明讓我初次感覺到了面向對象編程。這個題目集題目數量依然比較少,難度略有提升,讓我熟悉了方法有關的各類語法。正則表達式

   題目集三真正涉及到了類的設計,1,2題拋磚引玉讓我體會到了類設計的思路,第三題則須要徹底本身設計類。這個題目集題目數量較少,可是工做量不小,難度比較大。這個題目集讓我學會經過合理的設計類來簡化邏輯,經過重構來適應新需求,最重要的———利用不熟悉的知識來解決必定規模的問題,而且合理漸進的使用他們來避免大量未知錯誤在一開始爆發致使延誤開發。算法

設計與分析:

題目集1:7-8 判斷三角形類型

 

 

程序須要判斷三角形類型,要求可以識別非三角形,等腰三角形,等邊三角形,等腰直角三角形,直角三角形,通常三角形的狀況。難點在於要捋清各類三角形的邏輯包含關係,判斷三角形種類要儘量具體,這對邏輯有必定要求,寫出優雅健壯的代碼是比較有挑戰性的。編程

個人方法是,先利用java提供的排序方法將三邊的長度排序,快速識別斜邊(最長的邊)。先判斷是否爲合法的三角形,再依次判斷是否爲等邊三角形,等腰直角三角形,直角三角形,等腰三角形。即在判斷出構成三角形後,從具體到普遍的判斷三角形。數組

採坑心得

計算機處理浮點數會產生偏差,在計算勾股數時判斷浮點數之間的等量關係不能直接用」==「,而應該設置偏差,將大小差異偏差範圍內的視爲等於。設置偏差的過程當中即要保證不會漏判,也要保證不能錯判,偏差的大小要經過對具體的狀況進行具體的分析來設定。此外大量的if語句讓代碼難以理解更難以修改,即便寫了大量備註,可備註也要隨着代碼的更新而更新大大的增長了工做量。因此代碼書寫的過程當中規避的繁雜的實現是避免bug的關鍵。代碼總體的複雜度仍是偏高的。函數

改進建議

爲了加強代碼的可讀性能夠經過實現多個判斷三角形類型的方法,每種方法之對應惟一一種三角形,雖然效率上有犧牲可是卻減小了if加強了可讀性。還有一種方案是對三角形的各類性質(兩邊或三邊相等,直角)設置對應的枚舉,經過檢查枚舉來判斷三角形類型,這樣if語句的可讀性會提升。或者生成一顆邏輯上的樹,每一個節點都表明一種三角形,邏輯上是子概念的三角形是下相應三角形的子節點,經過由普遍到具體的檢查,當一個節點的全部父節點被知足的時候該節點被知足。這樣一樣避免使用大量帶&&複雜條件加強可讀性,也具備良好的擴展性。編碼

題目集2:7-4 求下一天

題目要求輸出某一日期的下一天,並給出了須要實現的方法包括,判斷閏年,判斷日期合法性,求下一天。這題涉及不少特殊狀況,關鍵是經過對這些特殊狀況進行分析,釐定前後判斷順序,用最少的判斷來解決問題。debug

個人方法是先判斷日期是否合法(包括閏年和平年)再直接對日加一,再判斷日期是否變得不合法,若是變得不合法表明日期因該變成下個月一號,再判斷月是否合法,若是變得不合法則日期因該爲下一年第一天。經過這樣的判斷日期是否由於加一天這個操做變得不合法,來一步一步改變日期最終獲得下一天,規避了判斷閏年平年和每月不一樣天數的複雜判斷,而是反覆利用日期是否合法來一步一步獲得結果大大減小了邏輯複雜度。設計

採坑心得

判斷閏年的狀況比較複雜,若是直接判斷閏年,那麼涉及的條件比較多,複雜的代碼是bug的溫牀。在這裏我選擇不去判斷是否爲閏年,而是去判斷是否不是平年,結果代碼大大的變簡潔了給我後來的debug工做帶來了不少方便。不少正面判斷比較難的條件,能夠考慮經過判斷反例來解決。合理的利用數組來代替switch是很是好的作法,讓數組的下標帶有意義(好比表明月份)也是很是優雅的。3d

 

改進建議

利用數組來儲存每月最大天數從而規避switch來判斷日期合法性,也能夠準備兩個數組分別表明閏年和平年的天數,用枚舉來表明閏年和平年,能夠大大加強代碼的可讀性,利用枚舉來代替下標,讓下標具備意義也是值得嘗試的作法.

 

題目集2:7-5 求前n天

題目要求程序求出某一天的前n天,並本身設計類來處理。一樣涉及日期處理關於每個月最大天數的數組,和判斷日期合法性以及求閏年,這些部分大致上能夠直接使用7-4的代碼。

個人方法是將7-4求下一天的代碼改寫成求前一天,邏輯基本不變,日期先見一再判斷日期是否合法,若是不合法,則日期變爲月份減一的最後一天,再判斷日期是否合法,如不合法則變爲上一年最後一天。重複n次,若是n爲負數則直接求下一天重複n'的絕對值次。

採坑心得

相對於下個月第一天,上個月最後一天更具備不肯定性,搞很差會致使儲存月份最大日的數組越界,適當的爲數組留白,是避免bug選擇之一。雖然如今並不那麼強調軟件的效率,而是重視開發速度。可是這種會提高複雜度的算法應該在細緻的研判數據再謹慎的使用,或者儘可能避免。

改進建議

實現求前n天改成求前一天n次雖然極大的利用了已有的代碼,可是卻將原來常數複雜度的算法變成了複雜度n的算法,這種操做是有風險的,在數據比較大的狀況下可能會超時,致使軟件質量不合格。經過把n超過一年的部分直接計算,再把超過一月的部分直接計算,甚至把超過400年的部分一次性計算來控制n的大小,管理複雜度.保證軟件質量。

題目集3:7-2 定義日期類

題目要求實現一個日期類並給出了類圖,根據類圖按圖索驥而且合理的利用以前題目的代碼,很快便獲得結果。

經過改變返回值和參數利用編譯器功能自動生成屬性,來簡化編碼過程。

採坑心得

經過體會和實現類圖,我對類中各個方法的耦合和屬性的設置有了粗略的體驗,對於方法會用到的數據,而對類沒有意義的能夠選擇將其做用域限制在方法內部以簡化類的簽名。方法只能嚴格實現方法名所表明的功能,類的屬性的和方法的設置最好符合直覺。經過方法間的調用來簡化邏輯。

改進建議

區分一個字段應該是類全部的仍是對象全部的,區分的結果因該符合直覺,好比儲存每個月最大日期的數組因該屬於類,設置成靜態。這樣既能夠節約空間也更符合直覺。

題目集3:7-3 一元多項式求導(類設計)

題目要求對冪函數多項式進行求導,冪函數有多種省略寫法,研判這寫發而且進行求導是難點所在。

個人方法是利用正則表達式"[+-]?[0-9]*[*]?x(?:[\\^][+-]?[0-9]*)?"來提取全部帶x的項,只有帶x的項須要求導。對於每一項用Pattern來分別提取每一項開首的數字和結尾的數字,若是提取不到就表明是省略的寫法,結果就是1或者-1.再對係數指數進行計算,經過對計算後的值進行研判來進行項的輸出。最後去掉開首的+獲得結果。

採坑心得

經過把一個大問題轉化爲小問題,來解決問題有時候會有奇效。關鍵是抓住問題不變的地方。對於每一個須要求導的項必然有x經過這一點就能夠寫出提取全部項的正則表達式。此外每一項分開求導再拼接,大大簡化了問題,經過最後1步去除開頭的+,避免了討論首項也簡化了解決方案。處理問題的時候相應的條件對應相應的部分也是否關鍵,對於係數的條件判斷之影響係數部分,而指數部分則影響是否結果中含x以及是否有顯式的指數。這樣下降不一樣代碼塊之間的耦合,給我debug和重構帶來了不少方便。

 

改進建議

題目中的正則表達式之並不能徹底保證提取出正確的項,沒有體現符號和係數之間的邏輯關係,這是很是大的隱患。每一次用循環中字符串的覆蓋讓聲明和內容顯得臃腫,利用list生成待處理的項串,再一次性處理拼接,把讀取和處理分開來,避免一個代碼塊過於複雜影響程序的可讀性和維護性。

相關文章
相關標籤/搜索