1.1.11
求一个布尔数组中为真的位置分布图。
public class Example1111 {
public static final int M = 10;
public static final int N = 4;
public static void main(String [] args){
boolean[][] a = new boolean[M][N];
a = RandomInit(a);
printBool(a);
}
//输出内容
public static void printBool(boolean[][] a){
for(int i = 0; i < M; i ++){
for (int j = 0; j < N; j ++){
if(a[i][j])
System.out.print("*" + " ");
System.out.print(" ");
}
System.out.println();
}
}
//产生随机布尔值
public static boolean[][] RandomInit(boolean[][] a){
for(int i = 0; i < M; i ++){
for (int j = 0; j < N; j ++){
a[i][j] = StdRandom.bernoulli();
}
}
return a;
}
}
1.1.13 编写一段代码,打印出一个 M 行 N 列的二维数组的转置(交换行和列)
public class Example1113 {
//Math.random()方法是产生一个双精度的范围为(0.00 - 1.00)之间的一个随机数
public static final int M = 10;
public static final int N = 5;
public static final int n = 10;//定义产生随机数的范围
public static void main(String [] args){
//System.out.println((int)(Math.random()*10));
int[][] num1 = new int[M][N];
int[][] num2 = new int[N][M];
num1 = RandomInitialization(num1,n);
showResult(num1,num2);
}
public static void showResult(int[][] num1, int[][] num2){
System.out.println("反转之后的数组为:");
for(int i = 0; i < M; i ++){
for(int j = 0; j < N; j ++) { //一定注意第二个 是j 不是i; 找了一晚上,心态爆炸!!!!
num2[j][i] = num1[i][j]; //定义为[N][M]就已经改变了数组的大小,自然可以放得下
}
}
//显示反转后的数组
for(int i = 0; i < N; i ++){
for (int j = 0; j < M ; j ++){
System.out.print(num2[i][j] + " ");
}
System.out.println();
}
}
public static int[][] RandomInitialization(int [][] num, int n){
StdOut.println("num1数组内容为:");
for(int i = 0; i < M; i ++){
for (int j = 0; j < N; j ++){
num[i][j] = StdRandom.uniform(10);
StdOut.print(num[i][j] + " ");
}
StdOut.println();
}
return num;
}
}
1.1.14
编写一个静态方法lg(),接受一个整型参数N,返回不大于log2N的最大整数。不使用Math库。
public class Example1114 {
/*
题意要求是整数,所以N必然是大于0的,
求的是(y = 2^x) <= N;
*/
private static int x = 0;
private static int y = 1;
public static int lg(int N){
if(N <= 0) return -1;
while(y <= N){
y *= 2;
x++;
}
return x-1;
}
}
1.1.15
public class Example1115 {
public static int[] histogram(int []a, int M){
int[] R =new int[M];
for(int i = 0; i < M; i ++){
R[i] = 0; //将默认数组清空
}
for(int i = 0; i < a.length; i ++){
if(a[i] >= 0 && a[i] < M ){
R[a[i]] ++;
}else{
System.out.println("存在数字不在0到M-1之间,为:" + a[i]);
}
}
return R;
}
}
test.java:
//1115
int[] a = {0,3,4,4,1,5,2,4,};
int M = 9;
System.out.println("M = " + M);
int sum = 0;
int R[] = Example1115.histogram(a, M);
for(int i = 0; i < R.length; i ++){
System.out.print(R[i] + " ");
sum += R[i];
}
System.out.println();
if(sum != a.length){
System.out.println("是不相等的,且sum = " + sum + ", a.length = " + a.length);
}else {
System.out.println("是相等的,且sum = a.length = " + sum);
}