Problem 1. (8 points) A miscellany.
a. Binary search begins by inspecting the middle element of a list or sublist thereof. If the list is linked, you will have to traverse half the nodes in the list/sublist to reach the middle one. In general, binary search takes at least as long to reach any given node as a naive search.
b. The compiler prints out the class, method, and line number where the exception occurred. Search that line for a “dot” (dereference) operation.
c. These lines cannot throw run-time errors.
boolean b1 = (head != null) && (head.next != null);
boolean b2 = (head == null) || (head.next == null);
Object o1 = (java.io.InputStream) System.in;
int ia[] = {3, 7};
d. public final.
(It is acceptable to replace public with the same protection level
as the array itself has, though it makes no difference.)
e. A cast changes the static type of an expression, and its effect on dynamic method lookup is nothing whatsoever.
Problem 2. (10 points) Inheritance.
public class Rational implements Comparable {
public int numer; // Numerator of a fraction (rational number).
public int denom; // Denominator. Invariant: denom is never zero.
private static short compare;
public int compareTo(Object o) {
Rational other = (Rational) o;
long myProduct = (long) numer * (long) other.denom;
long otherProduct = (long) other.numer * (long) denom;
if (myProduct == otherProduct) {
compare = 0;
} else if (myProduct < otherProduct ^ denom < 0 ^ other.denom < 0) {
compare = -1;
} else {
compare = 1;
}
return compare;
}
public Rational(int n, int denom) {
numer = n;
this.denom = denom;
if (denom == 0) System.exit(1); // Enforce the invariant.
}
protected static short lastCompareTo() {
return compare;
}
}
public class Integr extends Rational {
public Integr(int n) { // Construct the integer n/1.
super(n, 1);
}
public int compareTo(Object o) {
if (o instanceof Integr) {
if (numer < ((Integr) o).numer) {
return -1;
} else if (numer == ((Integr) o).numer) {
return 0;
} else {
return 1;
}
}
return super.compareTo(o);
}
}
public class WholeNum extends Integr { // Invariant: numer is never zero.
public WholeNum(int n) { // Construct the whole number n/1.
super(n); // super(n, 1); is also correct.
if (n == 0) System.exit(1); // Enforce the invariant.
}
public short makesNoSense() {
return Integr.lastCompareTo();
}
}
Problem 3. (7 points)
Run-length encoding an array of strings.
public SListNode rle(String[] strings) { // Run-length encode an array.
int i = strings.length - 1;
SListNode head = new SListNode(strings[i], 1, null);
for (i--; i >= 0; i--) {
if (strings[i].equals(head.item)) {
head.count++;
} else {
head = new SListNode(strings[i], 1, head);
}
}
return head;
}