AP计算机示例考题:主观题解答
第一大题
第一问
注意Trip
里Flight
的List
已经是按时间顺序存储。这里考察的是List
这一interface的size()
和get()
这两个基本方法。
如果Flight
的List
只有一个元素,那么flights.size() - 1
也为0
,即是计算单一航班的返程时间减去出发时间。
public int getDuration() { if (flights.size() == 0) { return 0; } Time depart = flights.get(0).getDepartureTime(); Time arrive = flights.get(flights.size() - 1).getArrivalTime(); return depart.minutesUntil(arrive); }
第二问
考察的是对List
元素的遍历,注意这里因为要将前后两个Flight
进行比较,通常较为方便的for-each循环不大适用。
编程思路上,使用了遍历并判断大小,将更小值存到中间变量这一模式。
public int getShortestLayover() { if (flights.size() < 2) { return -1; } int shortest = getDuration(); for (int k = 1; k < flights.size(); k++) { Flight flight1 = flights.get(k - 1); Flight flight2 = flights.get(k); Time arrive = flight1.getArrivalTime(); Time depart = flight2.getDepartureTime(); int layover = arrive.minutesUntil(depart); if (layover < shortest) { shortest = layover; } } return shortest; }
第二大题
第一问
查找使用indexOf()
,剪切使用substring()
,最后将各个部分使用concatenation连接起来。
public static String apcsReplaceAll(String str, String oldStr, String newStr) { String firstPart = ""; String lastPart = str; int pos = lastPart.indexOf(oldStr); while (pos >= 0) { firstPart += lastPart.substring(0, pos); firstPart += newStr; lastPart = lastPart.substring(pos + oldStr.length()); pos = lastPart.indexOf(oldStr); } return firstPart + lastPart; }
第二问
遍历List
并直接调用上一问完成的static函数,送分题。
public static String replaceNameNickname(String str, List people) { for (Person p : people) { str = apcsReplaceAll(str, p.getFirstName(), p.getNickname()); } return str; }
第三大题
第一问
考察的点是constructor的定义以及其中super()
的调用。因为Pet
中没有定义不带参数的constructor,因而Cat
和Dog
一样也必须显式定义public Cat(String petName)
。注意在Cat
中无法直接操作Pet
的private String name
,而应通过调用super()
达到这一目的,super()
必须写在第一句。
public class Cat extends Pet { public Cat(String petName) { super(petName); } public String speak() { return "meow"; } }
第二问
这里的super
指代所继承的Dog
,通过它可以调用Dog
的public method。
public class LoudDog extends Dog{ public LoudDog(String petName) { super(petName); } public String speak() { return super.speak() + super.speak(); } }
第三问
再一次使用了for-each。所有的child class都实现了abstract method speak()
。
public void allSpeak() { for (Pet a : petList) { System.out.println(a.getName() + a.speak()); } }
第四大题
第一问
倒序的for循环,每轮操作相邻的两个元素。最后别忘记按要求把额外的数字插入数组开头。
public static void shiftArray(int[] arr, int num) { for (int k = arr.length − 1; k > 0; k−−) { arr[k] = arr[k - 1]; } arr[0] = num; }
第二问
先保存每行最后的元素,再将其作为下一行shiftArray()
的参数。
public void shiftMatrix(int num) { for (int[] row: matrix) { int temp = row[row.length − 1]; ArrayUtil.shiftArray(row, num); num = temp; } }
第三问
注意matrix[0].length
中的0换成任意一行都没有问题,这个是求出每一行的长度也即列数。为简化问题,AP计算机科学假定所有的二维数组每行的元素数目都是相当的。
public void rotateMatrix(){ shiftMatrix(matrix[matrix.length − 1][matrix[0].length − 1]); }
0 条评论