算法四 第一章第一节基础习题

算法四第一章第一节基础习题

我只给出了代码类的习题
1.1.3  编写一个程序,从命令行得到三个整数参数。如果它们都相等则打印 equal,否则打印 not equal。

package chapter1;

import edu.princeton.cs.algs4.StdIn;//这是算法第四版这本书里面的类库
import edu.princeton.cs.algs4.StdOut;

public class ThreeEquals {

    public static void main(String[] args) {

        int a, b, c;
        a = b = c = 0;
        StdOut.println("please input a, b and c");
        a = StdIn.readInt();//读取一个整数
        b = StdIn.readInt();
        c = StdIn.readInt();
        if(equals(a,b,c) == 1)
            StdOut.println("equal");//在终端窗口输出字符串
        else
            StdOut.println("not equal");
         }
    public static int equals(int a,int b, int c){
        if(a == b&&b == c)
            return 1;
        else
            return 0;
    }
}

1.1.5  编写一段程序,如果 double 类型的变量 x 和 y 都严格位于 0 和 1 之间则打印 true,否则打印 false。

package chapter1;

import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;

public class test1 {

    public static void main(String[] args) {
        double x = 0;
        double y = 0;
        x = StdIn.readDouble();
        y = StdIn.readDouble();
        StdOut.println(compare(x)&&compare(y));

    }

    public static boolean compare(double m){
        if(m<1&&m>0)
            return true;
        else
            return false;
    }

}

1.1.9 编写一段代码,将一个正整数 N 用二进制表示并转换为一个 String 类型的值 s。

package chapter1;

import edu.princeton.cs.algs4.StdIn;
import edu.princeton.cs.algs4.StdOut;

public class showBinary {

    public static void main(String[] args) {
        int n = StdIn.readInt();
        StdOut.println(toBinary(n));
    }
    public static String toBinary(int n){
        String s = "";
        for(int N = n;N>0;N = N/2)
            s = N%2 + s;
        return s;
    }
}

1.1.11  编写一段代码,打印出一个二维布尔数组的内容。其中,使用 * 表示真,空格表示假。打印出 行号和列号。

package chapter1;

import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.StdRandom;

public class test1 {

    public static void main(String[] args) {
        boolean[][] a = new boolean[4][4];
        a = RandomInitial(a);
        printBool(a);
    }
    //用来显示boolean数组
    private static void printBool(boolean[][] a) {
        for(int i = 0;i<a.length;i++)
            StdOut.print(" "+i);
        StdOut.println();
        for(int i = 0;i<a.length;i++){
            StdOut.print(i);
            for(int j = 0;j<a.length;j++){
                if(a[i][j])
                    StdOut.print("*"+" ");
                else
                    StdOut.print("  ");
            }
            StdOut.println();
        }
    }
    //获得随机产生的boolean数组
    private static boolean[][] RandomInitial(boolean[][] a) {
        for(int i = 0;i<a.length;i++)
            for(int j = 0;j<a.length;j++){
                a[i][j] = StdRandom.bernoulli();//returns true with probability 1/2 and false with probability 1/2
                }
        return a;
    }

}

1.1.13 编写一段代码,打印出一个 M 行 N 列的二维数组的转置(交换行和列)。

package chapter1;

import edu.princeton.cs.algs4.StdOut;
import edu.princeton.cs.algs4.StdRandom;

public class Migrate {

    public static void main(String[] args) {
        int[][] a = new int[8][10];
        int[][] b = new int [10][8];
        int n = 10;
        a = RandomInitial(a,n);//随机初始化数组a
        b = MigrateArrays(a,b);//b是a的转置数组
        MigratePrint(b);//将数组输出

    }

    private static int[][] MigrateArrays(int[][] a, int[][] b) {
        // TODO Auto-generated method stub
        for(int i = 0;i<a.length;i++)
            for(int j = 0;j<a[0].length;j++)
                b[j][i] = a[i][j];
        return b;
    }

    private static void MigratePrint(int[][] b) {
        // TODO Auto-generated method stub
        StdOut.println("数组b:");
        for(int i=0;i<b.length;i++){
            for(int j = 0;j<b[0].length;j++)
                StdOut.print(b[i][j] + " ");
            StdOut.println();
        }
    }

    private static int[][] RandomInitial(int[][] a, int n) {
        // TODO Auto-generated method stub
        StdOut.println("数组a:");
        for(int i = 0;i<a.length;i++){
            for(int j = 0;j<a[0].length;j++){
                a[i][j] = StdRandom.uniform(n);
                StdOut.print(a[i][j]+" ");
            }
            StdOut.println();
        }       

        return a;
    }
}

1.1.14 编写一个静态方法lg(),接受一个整型参数N,返回不大于log2N的最大整数。不要使用Math库。

    public static int ln(int n) {
        // TODO Auto-generated method stub
        int m = 1;
        int i = 0;
        for(i = 0;m<=n;i++){
            m = m *2;
        }
        return i-1;
    }

1.1.15  编写一个静态方法 histogram(),接受一个整型数组 a[] 和一个整数 M 为参数并返回一个大小 为M的数组,其中第i个元素的值为整数i在参数数组中出现的次数。如果a[]中的值均在0到M-1 之间,返回数组中所有元素之和应该和 a.length 相等。

public static int[] histogram(int[] a, int n) {
        // TODO Auto-generated method stub
        int[] b = new int [n];
        for(int i = 0;i<b.length;i++)
            b[i] = 0;
        for(int i = 0;i<a.length;i++){
            b[a[i]]++;
        }
        return b;

1.1.20 编写一个递归的静态方法计算 ln(N!) 的值。

public static double cal(long N){
    if(N == 1)
        return 0;
    else
        return Math.ln(N)+cal(N-1);
}

1.1.22  使用 1.1.6.4 节中的 rank() 递归方法重新实现 BinarySearch 并跟踪该方法的调用。每当该方法 被调用时,打印出它的参数 lo 和 hi 并按照递归的深度缩进。提示:为递归方法添加一个参数 来保存递归的深度。

/*key是要寻找的值,lo和hi是查找范围,time记录递归深度,调用函数前应确保数组是有序的。
*/
public static int rank(int key,int[] a,int lo,int hi,int time){
        for(int j = 1;j<time;j++)
            StdOut.print(" ");
        StdOut.print(time);
        StdOut.println();
        int mid = lo + (hi - lo)/2;
        if(a[mid] == key)
            return mid;
        else if(a[mid] > key)
            return rank(key, a, lo, mid-1, ++time);
        return rank(key,a , mid+1, hi, ++time);
    }
  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值