算法四第一章第一节基础习题
我只给出了代码类的习题
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);
}