第一大题

第一问

考察对列表的循环遍历和字符串的相等比较。找到即返回,循环外返回null的模式。

public DownloadInfo getDownloadInfo(String title){
    for(DonwloadInfo info : downloadList){
        if(info.getTitle().equals(title))
            return info;
    }
    return null;
}

第二问

同样是对列表的遍历以及在列表后追加元素。注意for-each不是对downloadList,因而可以在循环体中修改它。

public void updateDownloads(List<String> titles){
    for(String title : titles){
        DownloadInfo info = getDownloadInfo(title);
        if(info)info.incrementTimesDownloaded();
        else downloadList.add(new DownloadInfo(title));
    }
}

第二大题

第一问

考察Math.random的使用。注意这个函数取到的是介于0和1之间的浮点数,需要熟练将其转换为所需的整数范围。

public TokenPass(int playerCount){
    board = new int[playerCount};
    for(int i = 0; i < playerCount; i++){
        board[i] = 1 + (int) (10 * Math.random());
    }
    currentPlayer = (int) playerCount * Math.random();
}

第二问

解答并不是最简单的写法,但尽量还原了整个游戏步骤,也推荐在考试时用这个思路来写。使用取模运算来防止数组越界是一个很好的技巧。

public void distributeCurrentPlayerTokens(){
    int token = board[currentPlayer];
    board[currentPlayer] = 0;
    int i = currentPlayer + 1;
    while(token > 0){
        board[i % board.length]++;
        token--;
        i++;
    }
}

第四大题

第一问

将一维数组转换为二维数组,需要对奇数行和偶数行进行不同的处理。索引的计算比较繁杂,务必要最后带回到题目中给的两个例子里试算一番。

public SkyView(int numRows, int numCols, double[] scanned){
    view = double[numRows][numCols];
    for(int i = 0; i < scanned.length; i++)
        if((i / numCols) % 2 == 0)view[i / numCols][i % numCols]=scanned[i];
        else view[i / numCols][numCols - i % numCols - 1]=scanned[i];
}

第二问

本质上还是一个二维数组的遍历,需要掌握如何在循环中进行累加。

public double getAverage(int startRow, int endRow, int startCol, int endCol){
    int count = 0;
    double sum = 0;
    for(int i = startRow; i <= endRow; i++){
        for(int j = startCol; j <= endCol; j++){
            sum += view[i][j];
            count++;
        }
    }
    return sum/count;
}

陈 欣

AADPS创始人

1 条评论

AP计算机2013年考试:主观题 – AP计算机科学A · 2019年3月20日 下午10:59

[…] AP计算机2013年考试:主观题解答 […]

发表评论