4-1.1.15
编写一个静态方法histogram(),接受一个整形数组a[]和一个整数M为参数并返回一个大小为M的数组,其中第i个元素的值为整数i在数组中出现的次数。如果a[]中的值均在0到M-1之间,返回数组中所有元素之和应该和a.length相等。
public class BinarySearch {
public static int[] histogram(int[] a, int M){
int[] b = new int[M];
for(int i = 0; i < M; i++){
int l = 0;
for(int j = 0; j < a.length; j++){
if (a[j] == i)
l++;
}
b[i] = l;
}
return b;
}
public static void main(String[] args) {
int[] A = {1, 2, 2, 5, 6, 8, 5, 10};
int M = 10;
int[] c = histogram(A, M);
int k = 0;
for (int i = 0; i < c.length; i++){
String str = "c[" + i + "] = " + c[i];
StdOut.println(str);
k += c[i];
}
StdOut.println(k);
if (k == A.length){
StdOut.println("所有数据均在 0~M-1之间");
}
}
}
1.1.22
使用1.1.6.4 中的 rank() 递归方法重新实现BinarySearch并跟踪该方法的调用。每当该方法被调用时,打印出它的参数 lo 和 hi 并按照递归的深度缩进。提示 :为递归方法加一个参数来保存递归的深度。
递归是对自身的调用:
递归的调用必须首先写终止条件。
所有子问题的不能冲突,也要涵盖所有子问题。
public static int rank(int hi, int lo, int key, int[] a, int count){
if (lo > hi){
return -1;
}
String s = "";
for(int i = 0; i < count; i++){
s = s + " ";
}
s = s + "lo = " + lo + " hi = " + hi;
StdOut.println(s);
count++;
int mid = lo + (hi - lo) / 2;
if (key < a[mid]){
hi = mid - 1;
return rank(hi, lo, key, a, count);
}
else if (key > a[mid]){
lo = mid + 1;
return rank(hi, lo, key, a, count);
}
else
return mid;
}
public static void main(String[] args) {
int[] whitelist = {1, 3, 7, 9, 10, 12, 15, 19, 32, 48};
Arrays.sort(whitelist);
int key = 9;
StdOut.println(1);
if (rank(whitelist.length - 1, 0, key, whitelist, 0) == -1){
StdOut.println(key);
}
}
}