三次題目集總結
- 2021 年 4 月 4 日
- 筆記
(1)前言:總結三次題目集的知識點、題量、難度等情況
第一次題目集
1,計算兩個數的和—-數據的輸入及運算
2,電話鍵盤字母數字轉換—-數字與字元的相互轉化,以及數據合法性檢驗
3,成績分級管理 —-java中選擇語句的運用
4,計算稅率—-java中選擇語句的運用
5,計算錢幣—-數據運算
6,使用一維數組求平均值—-數組的用法
7,對多個整數進行排序—-對一維數組進行排序
8,判斷三角形類型—-double類型轉化為int型,產生誤差
難度分析:第一次題目集,較為簡單,已經經過C語言的學習,java中很多語法都與之相似。
第二次題目集
1,IP地址轉換 —-二進位轉化為十進位
2,合併兩個有序數組為新的有序數組 —-合併數組並排序
3,判斷閏年及星期幾—-合理使用數組代替if
4,求下一天—-對方法的調用
5,求前N天—-合理利用數組及方法
難度分析:第二次題目集,並不難,並且該題目集中,後4題都十分類似。在合理利用數組的情況下,並沒有非常大的問題。
第三次題目集
1,創建賬戶類Account —-類的創建及使用、類中方法的調用
2,定義日期類—-類的創建及使用、類中方法的調用
3,一元多項式求導(類設計)—-字元串的處理(截取、連接)
難度分析:第三次題目集,前兩題只是增加了一個對類的處理,較為簡單。
最後一題,考察的是對字元串的處理,很多高效的方法沒有掌握熟練(正則表達式、split方法),因此該題對我而言十分吃力。
(2)設計與分析:
7-8判斷三角形類型
因為初期沒有學習關於類的知識,此題沒有使用到類
此題在對三個數比較大小時,我使用for循環和if,並且後續還使用if判斷三角形的類型(可以改進使用switch),導致複雜度太高。
另外,沒有寫注釋,也沒有使用方法,直接在Main方法中寫完程式碼。
SourceMonitor的報表:
7-4 求下一天
此題也沒有使用到類。
該題是求日期的下一天,因此要考慮的問題就包括數據的合法,以及跨年、跨月、閏年。均使用if判斷語句解決。
將各月份的天數存入數組,更為簡便,在數組中將月份+1,即可得到該月對應天數。省去了每月份都用if判斷,提高效率。
SourceMonitor的報表:
7-5 求前N天
沒有使用類
該題完全可以借鑒上一題7-4求下一天,將方法nextDate(),多傳入一個參數n。
將day++ 改為day-=n
與上題類似,將各月份的天數存入數組,便於使用。
SourceMonitor的報表:
7-2 定義日期類
該題主要是要理解對類的使用,而非前面題目集中,直接調用方法解決問題。
借鑒7-4中求下一天的方法,將年月日作為日期的私有屬性,將輸入的資訊參數傳入類中,再在類中調用方法,輸入結果。
複雜度與7-4類似,但使用類,做到了對數據的保護。
類圖
SourceMonitor的報表:
7-3 一元多項式求導(類設計)
沒有使用類
通篇使用if、for循環,導致複雜度太高,變成垃圾程式碼。
首先,拆分每一項,我是用if依次對每個字元進行判斷後截取,完全可以用正則表達式或split的方法代替,因為掌握不熟練,沒有使用。因此複雜度極高。
提取每一項的係數及指數,也是使用if判斷後,提取字元,然後轉化為int型,再進行求導運算。同樣也可用正則表達式或split的方法代替,減少複雜度。
對於每一項,可以創建一個類來儲存,因為對類的使用不熟練,而沒有使用。
SourceMonitor的報表:
(3)采坑心得:
第一次題目集最後一題判斷三角形類型中,涉及到根號的運算(判斷等腰直角三角形,斜邊為腰長的√2倍),此時在電腦中,就應考慮到誤差值,從而不能用
1 if( max*max==mid*mid+min*min )
而應改為
1 if( max*max-(mid*mid+min*min)<1e-5 )
(4)改進建議 :
第一次題目集中最後一題–判斷三角形類型,對三角形三條邊比較大小,我使用for循環一個一個比較 非常複雜,且效率極低
1 double min=a[0],max=a[0],mid=a[0]; 2 for(i=0;i<3;i++) { 3 if(a[i]>max) max=a[i]; 4 if(a[i]<min) min=a[i]; 5 num=num+a[i]; 6 } 7 mid=num-max-min;
對此,可以用Java中的Math類進行快速比較,
改進程式碼
1 double max,min,mid; 2 max=Math.max(Math.max(a[0],a[1]), a[2]); 3 min=Math.min(Math.min(a[0], a[1]), a[2]); 4 mid=a[0]+a[1]+a[2]-max-min;
第二次題目集 第一題 IP地址轉換,對八位二進位數字轉化為十進位。
我從後往前,依次求出各個二進位所對應的十進位數後,相加。每次循環都進行了if判斷,且還調用了Math類中的方法,增加了複雜度
1 for(i=7;i>=0;i--) { 2 if(a[i]==1) { 3 num1+=Math.pow(2, j); 4 } 5 j++; 6 }
改進程式碼
因為二進位中只有0和1,完全可以減少if語句的判斷,減低複雜度。
1 for(i=0;i<8;i++) { 2 num=num*2+a[i]; 3 }
(5)總結:
學到了什麼:順序、選擇、循環、方法(函數)在java中的使用。
了解複雜度的概念,盡量減少使用if,以及加註釋,增加程式可維護性。
對字元串的處理,字元串的連接、截取。
需要進一步學習及研究
BigInteger的使用(當整型數據超過了整數的最大類型長度long的話,數據無法裝入,因此要使用BigInteger類進行操作)
對類的使用(創建、調用)極其不熟練
java中的鏈表 Linked list
正則表達式