算法(第四版)
注:编码都是在一个项目中完成的,每一道题都是一个新类中的函数,最后全部放在了一个主函数中,主函数在本文的在最后。
1.1.9 编写一段代码,将一个正整数N用二进制表示并转化为一个String类型的值s。
编码:
public class Text1_1_9 {
String decimalToBinary(int number) //十进制转化二进制
{
String binarySystem=""; //定义一个字符串并令其为空
while(true)
{
int remainder=number%2==0?0:1; //判断余数为0还是1,如果可以整除就为0,不能整除就为1.
binarySystem=remainder+binarySystem; //令余数加上字符串
number/=2;
if(number==0) //如果十进制数为0便退出
break;
}
return binarySystem;
}
}
1.1.10 下面这段代码有什么问题?
int[] a;
for(int i =0;i<10;i++)
a[i]=i*i;
java中定义数组的方法一共有三种:
int[] a=new int[10]; //用new的方法定义
int[] a={1,2,3,6}; //直接初始化
int[] a=new int[]{1,2,3,4,5,6,7,22}; //new之后初始化在一个语句中完成
而此题无new且在定义后初始化,也没有给数组分配大小,直接用循环初始化,因此错误。
可以这样初始化这题的数组
第一种方法:
int[] a=new int[10]; //用new的方法定义数组大小分配内存,再用循环分配大小。需要预先分配数组大小
for(int i=0,i<10;i++)
a[i]=i*i;
第二种方法:
int[] a={0,1,4,9,16,25,36,49,64,81}; //直接初始化 不用填写数组大小
第三种方法:
int [] a=new int[]{0,1,4,9,16,25,36,49,64,81};//用new分配内存后直接初始化,不用填写数组大小
1.1.11 编写一段代码,打印出一个二维的布尔数组的内容。其中,使用*表示真,空格表示假。打印出行号和列号。
编码:
//第十一题
System.out.println(" 编写一段代码,打印出一个二维的布尔数组的内容。其中,使用*表示真,空格表示假。打印出行号和列号。");
boolean[][] list=new boolean[][] {{true,false},{false,true}};
Text1_1_11 i=new Text1_1_11();
i.printBooleanList(list,2,2);
public class Text1_1_11 {
void printBooleanList(boolean list[][],int line,int row)//传递数组,以及数组的行数和列数
{
for(int i=0;i<row;i++) //打印列号
System.out.print("\t"+i);
System.out.println();
for(int i=0;i<line;i++)
{
System.out.print(i); //打印行号
for(int j=0;j<row;j++)
{
//list[i][j]?System.out.println("*"):System.out.println(" "); //大神看一下为什么这个出错不可以运行,问题在哪里?
if(list[i][j])
System.out.print("\t*");
else
System.out.print("\t ");
if(j==row-1)
System.out.println(); //一行输出完就换行
}
}
}
}
结果:
1.1.12 以下代码段会打印出什么结果
int[] a=new int[10];
for(int i=0;i<10;i++)
a[i]=9-i;
for(int i=0;i<10;i++)
a[i]=a[a[i]];
for(int i=0;i<10;i++)
System.out.println(i);
编码:
public class Text1_1_12 {
void wahtPrint()
{
int[] a=new int[10];
for(int i=0;i<10;i++)
a[i]=9-i; //初始化数组:9,8,7,6,5,4,3,2,1,0
for(int i=0;i<10;i++)
a[i]=a[a[i]]; //对a[a[i]],中间的a[i]为数组中下标为i的内容,此结果为将数组内容倒置
for(int i=0;i<10;i++)
System.out.println(i);
}
}
结果:
1.1.13 编写一段代码,打印出一个M行N列的二维数组的转置(交换行和列)
编码:
//第十三题
System.out.println("编写一段代码,打印出一个M行N列的二维数组的转置(交换行和列)");
Text1_1_13 k=new Text1_1_13();
String[][] c=new String[][] {{"00","01","02"},{"10","11","12"}};
System.out.println("输出未转置的二维数组:");
k.printList(c, 2, 3);
System.out.println("输出转置后的二维数组:");
k.printList(k.lineToRow(c, 2, 3), 3, 2);
public class Text1_1_13 {
String[][] lineToRow(String a[][],int line,int row)//2 3
{
String[][] c=new String[row][line]; //建立一个与输入数组行列数相反的二维数组
for(int i=0;i<row;i++)
for(int j=0;j<line;j++)
{
c[i][j]=a[j][i];
}
return c;
}
void printList(String a[][],int line,int row) // 输出一个二维数组
{
for(int i=0;i<line;i++)
{
for(int j=0;j<row;j++)
System.out.print(a[i][j]+" ");
System.out.println();
}
}
}
结果:
1.1.15编写一个静态方法lg(),接受一个整形参数N,返回不大于log2(N)的最大真是整数。不使用Math函数.
编码:
public class Text1_1_14 {
static int log(int x) {
int[] log_2 = { //对1-256进行log2(x)取整
0,1,1,2,2,2,2,3,3,3,3,3,3,3,3,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,4,5,
5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,6,
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,
6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,6,7,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,
7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,8
};
int l = 0;
while (x >= 256) //如果大于256进入此循环
{
l += 8 ; //那么log2(X)的答案保底就是8
x =x/(2^8); //看看x跟256的关系
}
return l + log_2[x]; //相加求出结果
}
}