昨晚筆試,今天來做筆試總結
選擇題:剛開始是非技術的選擇題
技術性選擇題
編程題
首先記編程題:
題目好像是:一同學跑繞n*n的格子外圍跑步,每次跑n+1步,然后在第n+1步的地方做一標記,問其做第幾個標記的時候遇到重復標記的情況(包括重復格子那一次)。
輸入:兩行,第一行表示有m種格子操場
第二行表示格子的規模,即各種格子操場的n
輸出:m行,每一行對應一種格子操場的標記次數
如輸入:
2
4 8
輸出:
17
33
思路:首先,這是一個循環遍歷格子的過程,而且統計第一次重復遍歷同一格時已經標記過的格子數。
故采用取余和map接口的方法進行程序編寫,代碼如下:
1 import java.util.ArrayList; 2 import java.util.Arrays; 3 import java.util.List; 4 import java.util.Map; 5 import java.util.Scanner; 6 import java.util.TreeMap; 7 8 public class Main { 9 public static void main(String[] args) { 10 Scanner sc = new Scanner(System.in); 11 Main aa = new Main(); 12 int n = sc.nextInt(); 13 if (n == 0) 14 System.out.println(0); 15 int[] a = new int[n]; 16 while (sc.hasNextInt()) {//注意while處理多個case 17 int b = aa.dianshu(sc.nextInt()); 18 System.out.println(b); 19 } 20 } 21 public int dianshu(int n){ 22 if (n == 0){ 23 return 0; 24 } 25 Map<Integer, Integer> map = new TreeMap<Integer, Integer>();//利用map鍵值對的不可重復性來進行判斷 26 while(true){ 27 for(int i=0;i%(n*4)<=n*n+1;i=i+n+1){ 28 int s = i%(n*4);//取余操作 29 if(map.containsKey(s)){ 30 return map.size()+1; 31 } 32 else{ 33 map.put(s, 1); 34 } 35 } 36 } 37 } 38 }
如有紕漏,望提出。
然后是選擇題中自己不熟悉的一些知識點:
1.無向圖的深度遍歷
使用深度優先搜索來遍歷這個圖的過程具體是:首先以一個未被訪問過的頂點為起始頂點,沿當前頂點的邊走到未訪問過的頂點:當沒有未訪問的頂點時,則回到上一個頂點,繼續試探訪問別的頂點,直到所有的頂點都被訪問過。顯然,深度優先遍歷是沿着圖的某一條分支遍歷直到末端,然后回溯,在沿着另一條進行同樣的遍歷,直到所有的頂點都被訪問過為止。
原文:https://blog.csdn.net/weixin_42678507/article/details/83114549
補充:java遍歷樹(深度優先+廣度優先)http://www.cnblogs.com/toSeeMyDream/p/5816682.html
2.for循環的實際執行過程
java中for循環i++和++i的區別
首先是for循環的執行過程
for(A;B;C) { D; }
即
- 進入循環執行A;//只是進入的時候執行.
- 執行B;//條件為真才執行D,不然就跳出for了.
- 執行D;
- 執行C;
- 再回到第2步開始執行
為此,在for循環中i++和++i的執行結果是相同的,但是在Java中i++語句是需要一個臨時變量取存儲返回自增前的值,而++i不需要。這樣就導致使用i++時系統需要先申請一段內存空間,然后將值賽如進去,最后不用了才去釋放。多了這么一系列操作時間當然多了啊,最后建議大家以后在寫for循環且不影響邏輯的情況下多使用++i,少使用i++。
參考:https://blog.csdn.net/github_37847975/article/details/77369851
3.異常拋出時的過程
4.重載、覆蓋
重載和覆蓋是java多態性的不同的表現方式。其中,重載是在一個類中多態性的一種表現,是指在一個類中定義了多個同名的方法,他們或有不同的參數個數,或有不同的參數類型,或參數順序不同。與訪問修飾符和返回值類型無關。在使用重載時,需要注意以下幾點:
1) 重載是通過不同的方法參數來區分的,例如不同的參數個數,不同的參數類型或者不同的參數順序。
2) 重載和方法的訪問修飾符、返回值類型、拋出的異常類型無關。
3) 對於繼承來說,如果父類方法的訪問修飾符為private,那么就不能在子類對其重載;如果子類也定義了一個同名的函數,這只是一個新的方法,不會達到重載的效果。
覆蓋是指子類函數覆蓋父類函數。覆蓋一個方法並對其進行重寫,以達到不同的作用。在使用覆蓋時要注意以下幾點:
1) 子類中的覆蓋方法必須要和父類中被覆蓋的方法有着相同的函數名和參數。
2) 子類中覆蓋方法的返回值必須和父類中被覆蓋方法的返回值相同。
3) 子類中覆蓋方法所拋出的異常必須要和父類中被覆蓋方法所拋出的異常一致。
4) 父類中被覆蓋的方法不能為private,否則其子類只是定義了一個方法,並沒有對其覆蓋。
覆蓋和重載的區別如下:
1) 覆蓋是子類和父類之間的關系,是垂直關系;重載是同一個類中方法之間的關系,是水平關系。
2) 覆蓋只能由一對方法產生關系,重載是多個方法之間的關系。
3) 覆蓋要求參數列表相同,重載要求參數列表不同。
4) 覆蓋關系中,調用方法是根據對象的類型來決定;而重載關系是根據調用時的實參表與形參表來選擇方法體的。
覆蓋和重載的區別:https://blog.csdn.net/qiuchaoxi/article/details/79790736
5.多態中子類和父類的關系
java多態性,父類引用指向子類對象
使用父類類型的引用指向子類的對象;
該引用只能調用父類中定義的方法和變量;
如果子類中重寫了父類中的一個方法,那么在調用這個方法的時候,將會調用子類中的這個方法;(動態連接、動態調用)
變量不能被重寫(覆蓋),”重寫“的概念只針對方法,如果在子類中”重寫“了父類中的變量,那么在編譯時會報錯。
https://www.cnblogs.com/shilin/p/4784862.html
6.protected和private的訪問權限
private修飾詞,表示成員是私有的,只有自身可以訪問;
protected,表示受保護權限,體現在繼承,即子類可以訪問父類受保護成員,同時相同包內的其他類也可以訪問protected成員。
無修飾詞(默認),表示包訪問權限(friendly, java語言中是沒有friendly這個修飾符的,這樣稱呼應該是來源於c++ ),同一個包內可以訪問,訪問權限是包級訪問權限;
public修飾詞,表示成員是公開的,所有其他類都可以訪問;
7.相除和取余
a = 13 / 5,a = 2,其實就是數學上的13 / 5 ,結果為2。
b = 13 % 5,b = 3,這也是數學上的運算,得出余數為3。
c = 5 / 13,c = 0,因為被除數小於除數,結果可以看成0.x,但是int類型是整數類型,所以結果只為0。
d = 5 % 13,d = 5,數學上規定:如果被除數比除數小,商是0,余數就是被除數本身。
取余運算的符號是根據第一個運算數決定的,-13 % 5結果是-3,而13 % -5結果則是3。
原文:https://blog.csdn.net/sinat_41152339/article/details/81054379