本笔记涉及代码:https://github.com/hackeryang/Algorithms-Fourth-Edition-Exercises
1.Java中的length属性是针对数组说的,比如说声明了一个数组,想知道这个数组的长度则用到了length这个属性,例如有个数组int[] a,那么a的长度就是a.length。length()方法是针对字符串String说的,如果想看这个字符串的长度则用到length()这个方法。size()方法是针对泛型集合说的,如果想看这个泛型有多少个元素,就调用此方法来查看,例如:
List array=new ArrayList();
array.add(a);
System.out.println(array.size());
2.利用牛顿迭代法求平方根:
package Chapter1_1Text;
public class SqrtNewton { //利用牛顿迭代法求平方根
public static double sqrt(double c){ //c为要开方的数,如2则计算根号2
if(c<0) return Double.NaN;
double err=1e-15; //接近于0的数
double t=c;
while(Math.abs(t-c/t)>err*t) //随着迭代t会变,c/t越来越接近要计算的开平方值t,误差超过err*t时就继续迭代计算,误差小于这个值则代表结果足够接近
t=(c/t+t)/2.0; //详细公式解释链接:https://www.zhihu.com/question/20690553
return t;
}
public static void main(String[] args){
SqrtNewton a=new SqrtNewton();
System.out.println(a.sqrt(2));
}
}
3.颠倒数组元素的顺序:
package Chapter1_1Text;
public class SwapArray { //颠倒数组元素的顺序
public static void main(String[] args){
double[] a=new double[10];
int N=a.length;
for(int i=0;i
double temp=a[i];
a[i]=a[N-1-i];
a[N-i-1]=temp;
}
}
}
4.随机将double数组中的元素排序:
package Chapter1_1Text;
import edu.princeton.cs.algs4.StdRandom;
public class Shuffle { //随机将double数组中的元素排序
//随机将double数组中的元素排序
public static void shuffle(double[] a){
int N=a.length;
for(int i=0;i
//将a[i]和a[i+N-1]中任意一个元素交换
int r=i+ StdRandom.uniform(N-i);
double temp=a[i];
a[i]=a[r];
a[r]=temp;
}
}
}
5.Double变量初始化为无穷大:使用Double.POSITIVE_INFINITY和Double.NEGATIVE_INFINITY。
6.1/0与1.0/0.0结果不同,前者会产生运行时除以零异常,会终止程序;而后者的结果是Infinity。
7.For循环与等价的while形式的区别:for循环头部的代码与for循环的主体代码在同一个代码段之中,递增变量在一般循环结束之后是不可用的,但是在等价的while循环中,递增变量在循环结束之后依然是可用的。
8.将一个数字转换为二进制:
package Chapter1_1Low;
import edu.princeton.cs.algs4.StdOut;
public class DecimalToBinary { //将一个数字转换为二进制
public static String decimalToBinary(int n){
String resultString="";
for(int i=31;i>=0;i--)
resultString=resultString+(n>>>i&1); //将整数每一个高位右移至相应的最低位再“与”1,结果转换为字符串从左到右排列输出,依然是原来的二进制
return resultString;
}
public static void main(String[] args){
StdOut.println(decimalToBinary(97));
}
}
9.矩阵转置:
package Chapter1_1Low;
public class ArraySwap { //矩阵转置
public static void main(String[] args){
int[][] a={{1,2,3},{4,5,6}};
int[][] temp=new int[a[0].length][a.length]; //三行二列
for(int i=0;i
for(int j=0;j
temp[i][j]=a[j][i];
System.out.print(temp[i][j]+" ");
if(j==a.length-1)
System.out.print("\n");
}
}
}
}
10.柱状图的实现:
package Chapter1_1Low;
public class Histogram { //柱状图的实现
public static int[] histogram(int[] a,int M){
int[] b=new int[M];
int n=0;
int m=0;
for(int i=0;i
for(int j=0;j
if(i==a[j]){
n++;
}
b[i]=n;
}
n=0;
}
for(int i=0;i
m=m+b[i];
}
return b;
}
public static int[] histogram2(int[] a,int M){
int[] h=new int[M];
int N=a.length;
for(int i=0;i
if(a[i]
h[a[i]]++;
return h;
}
public static void main(String[] args){
int a[]={1,2,3,4,5,6,7,8,9,10,11,11,11,12};
int M=13;
int b[]=histogram(a,M);
System.out.println("调用函数后获取的数组:");
for(int i=0;i
System.out.println(b[i]);
}
}
}
11.二分查找算法,每递归二分一次,输出就缩进一个空格:
package Chapter1_1Low;
public class Rank { //二分查找算法,每递归二分一次,输出就缩进一个空格
public static int rank(int key,int[] a){
return rank(key,a,0,16,1);
}
public static int rank(int key,int[] a,int lo,int hi,int deep){
//如果key存在于a[]中,它的索引不会小于lo且不会大于hi
if(lo>hi)
return -1;
int mid=lo+(hi-lo)/2;
for(int i=0;i
System.out.print(" ");
System.out.println("lo: "+lo+" hi: "+hi);
if(key