Java程式設計(2021春)——第三章類的重用課後題(選擇題+程式設計題)答案與詳解
Java程式設計(2021春)——第三章類的重用課後題(選擇題+程式設計題)答案與詳解
目錄
第三章選擇題
Tip:選擇題部分我只針對部分我出錯的或我認為有價值的題目在此整理。
3.0 導學
無
3.1.1-3.1.2 類繼承的概念和語法
無
3.1.3 隱藏和覆蓋
無
3.2 Object
類
無
3.3 終結類與終結方法
T2
題面
如果需要丟擲異常,可能會使用下面哪些關鍵字
A final
B finally
C finalize
D catch
答案
B D
詳解
選項中和異常相關的只有finally
和catch
。(其實這應該是沒講過,筆者目前還沒接觸過相關內容,先mark一下)
T3
題面
下面程式的執行結果是(忽略換行)
class C{ final public int methos(){ System.out.println("a"); return 0; } } public class A extends C{ final public int method (int x){ System.out.println(x); return 0; } public static void main(String[] args){ A a = new A(); C c = new C(); a.method(2); c.method(); } }
A 2 2
B 2 a
C 執行錯誤,因為C的final方法不能被重寫
D 執行錯誤,因為A重寫method時引數表不一樣
答案
B
詳解
由於引數表不一樣,因此並非重寫方法,而是定義新方法。執行結果應該為2 a。
T4
題面
不能用來修飾interface的有
A private
B public
C final
D static
答案
A C D
詳解
可以修飾interface
的只有public
。可以修飾class
的有public
final
abstract
。
T6
題面
final類和方法的存在處於以下哪些方面的考慮
A 安全方面
B 設計方面
C 程式碼結構簡單
D 能夠提高執行效率
答案
A B D
詳解
詳見鄭莉老師《Java語言程式設計(第2版)》118-119頁。
3.4 抽象類
T1
題面
下面關於抽象類和抽象方法的說法中,錯誤的是
A 抽象類可以包含非抽象方法
B 抽象類可以包含介面方法
C 抽象類可以包含抽象方法
D 抽象類不可以被例項化
答案
B
詳解
只有介面類可以包含介面方法。
3.5 泛型
T1
題面
Java泛型機制的優點有
A 可以使程式碼編寫變得簡單
B 比較安全
C 消除對Object類的強制型別轉換=
D 使得程式碼執行效能增強
答案
A B C
詳解
無
3.6 類的組合
無
3.7 小結
無
第三章程式設計題
T1 唯一路徑
題面
給定一個M*N的網格,你需要從左上角走到右下角,每一步你只能向下移或者向右移,請計算你能走的路徑個數。 輸入為一行,M和N,輸出為路徑數
樣例輸入:
2 2
樣例輸出:
2
樣例解釋
無
思考和詳解
與這道題類似的題筆者似乎在三年前做過(三年前的碼力遠超現在),應該是帶有動態規劃思想的,做起來類似廣度優先搜尋但是實現上不一樣。具體來說就是隻要給出M*N
的地圖,對於期中任意一格,從左上角到達該格的路徑數即為該格左側和上側相鄰兩格路徑數之和,因此只需要從左上角格子開始,遍歷每個格子,保證遍歷到每個格子的時候其左側和上側的格子都已知即可,具體實現的時候需要對格子邊界做一點初始化。但是,本題在學堂線上oj上只得了30分,相同的思路完成與這道題類似的題得到了通過,這兩題確實有差別,但是筆者思考並上網查找了很久也不知道差別在哪,如果讀者有想法歡迎在評論區指出或私信我,謝謝!
具體程式碼
import java.util.Scanner;
class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int m = in.nextInt();
int n = in.nextInt();
in.close();
int[][] arr = new int[m + 2][n + 2];
for (int i = 0; i <= m; i++) {
for (int j = 0; j <= n; j++) {
arr[i][j] = 0;
}
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (i == 1 && j == 1) {
arr[1][1] = 1;
continue;
}
arr[i][j] = arr[i - 1][j] + arr[i][j - 1];
}
}
System.out.println(arr[m][n]);
}
}
T2 矩陣螺旋填充
題面
給定一個整數n
,生成一個以1
到nxn
的螺旋形填充的方陣。
樣例輸入:
3
輸出:
1 2 3
8 9 4
7 6 5
樣例解釋
如輸出所示
思考和詳解
核心思路:Step1
給二維陣列arr[][]
賦值;Step2
將二維陣列arr[][]
按題目要求打印出來。
具體細節:在給二維陣列賦值時,按照題面要求進行模擬即可,利用oper
操作識別符號,x,y
座標,ct
當前標記數字,cnt
將按此方向行進多少來確定func
方法,需要注意的是最後如果cnt
到達了0
但是ct
還未到達n*n
,則說明還差最後一個數字需要填入。
具體程式碼
import java.util.Scanner;
public class matrix {
public static int[][] arr;
public static int n;
public static void func(int oper, int x, int y, int ct, int cnt) {
if (ct >= n * n || x > n || y > n)
return;
else if (cnt == 0) {
arr[x][y] = ++ct;
return;
}
int i;
if (oper == 1) {
for (i = y; i <= y + cnt - 1; i++) {
arr[x][i] = ++ct;
}
func(2, x, i, ct, cnt);
} else if (oper == 2) {
for (i = x; i <= x + cnt - 1; i++) {
arr[i][y] = ++ct;
}
func(3, i, y, ct, cnt);
} else if (oper == 3) {
for (i = y; i >= y - cnt + 1; i--) {
arr[x][i] = ++ct;
}
func(4, x, i, ct, cnt);
} else if (oper == 4) {
for (i = x; i >= x - cnt + 1; i--) {
arr[i][y] = ++ct;
}
func(1, i + 1, y + 1, ct, cnt - 2);
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n = in.nextInt();
in.close();
arr = new int[n + 20][n + 20];
func(1, 1, 1, 0, n - 1);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
}
T3 完美平方數
題面
給定正整數n,找到最小數量的完美平方數(例如1, 4, 9, 16, ...),其總和為n。 例如,給定n = 12,返回3,因為12 = 4 + 4 + 4; 給定n = 13,返回2,因為13 = 4 + 9。
樣例輸入
12
樣例輸出
3
樣例解釋
見題面
思考與詳解
這個題我第一直覺是寫個遞迴搜尋,然後就TLE
了,得了40分。大致思路就是首先找出所有小於n
的平方數,存在陣列arr
中,然後從arr[ct-1]
開始搜尋,記錄當前和nowNum
和當前平方數的數量cnt
。程式碼如下:
import java.util.Scanner;
public class squareNumber {
public static int n, ct = 0;
public static int[] arr;
public static int ans;
public static void findSquareNumber() {
for (int i = 1; i <= n; i++) {
if (i * i <= n) {
arr[ct++] = i * i;
}
}
}
public static void func(int nowNum, int cnt, int flag) {
if (nowNum > n)
return;
else if (nowNum == n) {
ans = ans < cnt ? ans : cnt;
return;
} else {
for (int i = ct - 1; i >= flag; i--) {
func(nowNum + arr[i], cnt + 1, i);
}
}
}
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n = in.nextInt();
in.close();
arr = new int[n + 100];
findSquareNumber();
ans = n + 100;
func(0, 0, 0);
System.out.println(ans);
}
}
百度了一下發現和leetcode 279是一樣的題目,考察的知識點是動態規劃。
這份官方題解給出了不錯的思路,我就不再贅述,直接在下面給出本題的完整程式碼。
具體程式碼
import java.util.Scanner;
public class squareNumber {
public static int n, ct = 0;
public static int[] ans;
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
n = in.nextInt();
in.close();
ans = new int[n + 10];
for (int i = 1; i <= n; i++) {
int minn = Integer.MAX_VALUE;
for (int j = 1; j * j <= i; j++) {
minn = Math.min(minn, ans[i - j * j]);
}
ans[i] = minn + 1;
}
System.out.println(ans[n]);
}
}