Problem 1 mergesort, binary search
Problem 1 Rubric (4):
-0.5 pts off for each one marked incorrectly of a - g
Problem 2
A. O(nlogn) B. O(log n) C. O(log n) D. O(n)
Problem 2 Rubric (8):
-2 for each incorrect answer
Problem 3
Many correct solutions (all look very similar).
Stack 1:
main mergesort merge <--- top
main mergesort mergesort merge <--- topProblem 3 Rubric outline (6):
public class MineField { // define your mines variable here: (1) Set<MineLoc> mines; . . . // other constants and instance variables not shown /** Create a minefield with same dimensions as the given array, and populate it with the mines in the array such that if mineData[row][col] is true, then hasMine(row,col) will be true and vice versa. . . . (other details left out) @param mineData the data for the mines; must have at least one row and one col. */ public MineField(boolean[][] mineData) { initMines(mineData); . . . [code to initialize the other instance variables not shown] } /** Initializes the mines variable from mineData such that if mineData[row][col] is true, then hasMine(row,col) will be true and vice versa. @param mineData the mine data; must have at least one row and one col. */ private void initMines(boolean[][] mineData) { // (2) mines = new HashSet<MineLoc>(); for (int row = 0; row < mineData.length; row++) { for (int col = 0; col < mineData[0].length; col++) { if (mineData[row][col]) { mines.add(new MineLoc(row, col)); } } } } /** Returns whether there is a mine in this square @param row row of the location to check @param col column of the location to check @return whether there is a mine in this square PRE: inRange(row, col) */ public boolean hasMine(int row, int col) { // (3) return mines.contains(new MineLoc(row, col)); } // (4) any additional code class MineLoc { private int row; private int col; public MineLoc(int r, int c) { row = r; col = c; } }
Problem 4A Rubric outline (18):
Problem 4B (2). O(1)
Problem 4C. O(1)
Problem 4C Rubric outline (2):
Problem 4D (2). VisibleField would not have to change at all.
Problem 5
Problem 5 Rubric outline (8):
Problem 6
There were many approaches. We'll show solutions for a few of them here.
Solution 1: 4-parameter helper with 2 reach-the-middle base cases
public boolean isUpDown(int[] a) { return isUpDownR(a, 0, a.length-1, 1); } public boolean isUpDownR(int[] a, int low, int high, int curr) { int len = high - low + 1; boolean firstIsCurr = a[low] == curr; if ((len == 1) && firstIsCurr) { return true; } boolean firstIsLast = a[low] == a[high]; if ((len == 2) && firstIsCurr && firstIsLast) { return true; } if ((!firstIsCurr) || (!firstIsLast)) { return false; } return isUpDownR(a, low + 1, high - 1, curr + 1); }
public boolean isUpDown(int[] a) { return isUpDownR(a, 0); } public boolean isUpDownR(int[] a, int low) { int high = a.length - low - 1; if (low > high) { return true; } // the two values crossed int curr = low + 1; boolean firstIsCurr = a[low] == curr; boolean firstIsLast = a[low] == a[high]; // when len==1 --> low==high if ((!firstIsCurr) || (!firstIsLast)) { return false; } return isUpDownR(a, low + 1); }
public boolean isUpDown(int[] a) { // have to check that the end values are 1 for this solution if ((a[0] != 1) || (a[a.length-1] != 1)) { return false; } return isUpDownR(a, 1); // pass in 1 bc going to compare with previous value } public boolean isUpDownR(int[] a, int low) { int high = a.length - low - 1; if (high < low) { return true; } // check ascends by one and equal to the value in the same place on the other side if (a[low] != a[low-1] + 1 || a[low] != a[high]) { return false; } return isUpDownR(a, low + 1); }