第一大题

第一问

注意TripFlightList已经是按时间顺序存储。这里考察的是List这一interface的size()get()这两个基本方法。

如果FlightList只有一个元素,那么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,因而CatDog一样也必须显式定义public Cat(String petName)。注意在Cat中无法直接操作Petprivate 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]);
}

陈 欣

AADPS创始人

发表评论