版权声明:如需转载,请写明出处 https://blog.csdn.net/weixin_43113679/article/details/87285091
学编程肯定要学点算法,我就选了《算法》第四版作为自己学算法的开头,虽然在学校里学数据结构,但是还是太浅了,整理一些自己可能会需要的算法程序。
一、典型的数组处理代码
任务 | 实现(代码片段) |
---|---|
找出数组中最大的元素 | double max = a[0]; for (int i = 1; i < a.length; i++) if (a[i] >max) max = a[i]; |
计算数组元素的平均值 | int N = a.length; double sum = 0.0; for (int i = 0; i < N; i++) sum += a[i]; double average = sum / N; |
复制数组 | int N = a.length; double b = new double[N] for (int i = 0; i < N; i++); b[i] = a[i]; |
颠倒数组元素的顺序 | int N = a.length; for (int i = 0; i < N/2; i++) { double temp = a[i]; a[i] = a[N-i-1]; a[N-i-1] = temp; } |
矩阵相乘(方阵) a[][] * b[][] = c[][] |
int N = a.length; double[][] c = new double[N][N] for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) {//计算行i和列j的点乘 for(int k = 0; k <N; k++) c[i][j] += a[i][k] *b[k][j]; } |
二、初步介绍递归
编写递归代码最重要的有三点:
- 递归总有一个最简单的情况——方法的第一条语句总是一个包含return的条件语句。
- 递归调用总是去尝试去解决一个规模更小的问题,这样递归才能收敛到最简单的情况。
- 递归调用的父问题和尝试解决的子问题之间不应该有交集。
下面用二分法查找的递归实现来看一下(数组a是有序的)
public static int rank(int key,int[] a){
return rank(key, a, 0, a.length);
}
public static int rank(int key, int[] a, int lo, int hi){
//如果key存在于a[]中,它的索引不会小于lo且不会大于hi
if (lo > hi){
return -1;
}
int mid = lo + (hi - lo) / 2;
if (key < a[mid]) return rank(key, a, lo, mid-1);
else if (key > a[mid]) return rank(key, a, mid+1, hi);
else return mid;
}
在上面的代码中,两个子问题各自操作的数组部分是不同的,
警告:
违背其中任意一条都有可能得到错误的结果或是低效的代码
三、格式化输出
System.out.printf("%.2f\n","想转成前面参数样的数");
第一个参数:%必须加,.2代表是小数点后2位有效数字,\n代表换行
数据类型 | 转换代码 | 举例 | 格式化字符串举例 | 转换后输出的字符串 |
---|---|---|---|---|
int | d | 512 | “%14d” "%-14d" |
" 512" "512 " |
double | f e |
1595.1680010754388 | “%14.2f” "%.7f" "%14.4e" |
" 1595.17" ”1595.1680011" " 1.5952e+03" |
String | s | "Hello,World" | “%14s” "%-14s" "%-14.5s" |
" Hello,World" "Hello,World " "Hello " |
四、需要的扩展库
如果你没系统的学过java那你可以按教程来安装需要扩展的库,如果学过我想你看到它扩展的库的时候就已经知道怎么用java现有的库来代替了,所以看个人情况。