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 条评论