算法4第一章习题

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);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值