算法很美 java基础篇
数组
数组的声明
数组的创建
1
| 元素类型[] 数组引用变量 = new 元素类型[数组大小]
|
默认值
数组的默认值为创建数组类型的默认值
数值型 0/0.0
布尔类型 false
引用型 null
内存模型
数组变量实际存储的是指向数组的引用
数组变量是存放在栈中的 而数组是存储在堆中的 变量引用指向堆内存中的数组
数组的简单案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146
|
public static Integer[] initArr(int length, int min, int max){
Integer[] arr = new Integer[length];
for(int i = 0; i < arr.length; i++){ arr[i] = (int)(min + Math.random() * (max - min + 1)); }
return arr; }
public static void printArr(Integer[] arr){ for(int i = 0; i < arr.length; i++){ System.out.print(arr[i] + "\t"); } System.out.println(); }
public static Integer arrMax(Integer[] arr){
Integer max = arr[0];
for(int i = 0; i < arr.length; i++){ if(arr[i] > max){ max = arr[i]; } }
return max; }
public static Integer arrMin(Integer[] arr){
Integer min = arr[0];
for(int i = 0; i < arr.length; i++){ if(arr[i] < min){ min = arr[i]; } }
return min; }
public static Integer arrSum(Integer[] arr){
Integer sum = 0; for(int i = 0; i < arr.length; i++){ sum += arr[i]; }
return sum; }
public static Double arrAvg(Integer[] arr){
Integer arrSum = arrSum(arr);
Double avg = Double.valueOf((arrSum / arr.length));
return avg; }
public static void randomArr(Integer[] arr){
for(int i = 0; i < arr.length; i++){ int j = (int)(Math.random() * 10); int temp; temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; }
printArr(arr); }
public static void frontArr(Integer[] arr){
int temp = arr[0]; for (int i = 1; i < arr.length; i++) { arr[i - 1] = arr[i]; }
arr[arr.length - 1] = temp;
printArr(arr); }
public static void main(String[] args) {
Integer[] initArr = initArr(10, 10, 20);
printArr(initArr);
System.out.println("最大值 " + arrMax(initArr)); System.out.println("最小值 " + arrMin(initArr)); System.out.println("总和 " + arrSum(initArr)); System.out.println("平均值 " + arrAvg(initArr)); System.out.println("前移后数组为"); frontArr(initArr); System.out.println("交换位置后的数组为"); randomArr(initArr); }
|
foreach(jdk1.5开始引用出来的)
1 2 3
| for(double e:myList){ System.out.println(e); }
|
理解:对myList中每个元素e进行以下操作
基本数据类型和引用数据类型
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public static void main(String[] args) {
System.out.println("基本数据类型演示"); int i = 10; int j = i; i = 20; System.out.println("j = " + j);
System.out.println("引用数据类型演示"); double[] arr1 = {1,2,3,4,5};
double[] arr2 = new double[5];
arr2 = arr1; arr1[0] = 0;
for(double e : arr2){ System.out.println(e); }
}
|
System.arraycopy
复制数组
1 2 3
| public static native void arraycopy(Object src, int srcPos, Object dest, int destPos, int length);
|
src
原数组
srcPos
原数组下标
dest
目的地数组
destPos
目的地下标
length
copy长度
arraycopy方法不会给目标分配内存空间 复制前必须创建目标数组以及分配内存空间
1 2 3 4 5 6 7 8 9
| double[] arr1 = {1,2,3,4,5};
double[] arr2 = new double[5];
System.arraycopy(arr1,1,arr2,0,3);
for(double e : arr2){ System.out.println(e); }
|
值传递
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| public static void main(String[] args) {
int x = 1; int[] y = new int[5];
m(x,y);
System.out.println("x = " + x);
System.out.println("y[0] = " + y[0]);
}
public static void m(int number, int[] arr){ number = 521; arr[0] = 1314; }
|
这个就是栈和堆的问题 基本数据类型和引用数据类型的区别 因为基本数据类型是存放在栈内存中的 传递回去的时候不受影响 而引用数据类型是指向堆内存的 而上面这个例子操作的是同一块堆内存 所以引用数据类型改变 基本数据类型不变
检测数组中每个字母出现的数量
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public static void main(String[] args) {
String s = RandomUtil.randomLowercaseString(100);
char[] c = s.toCharArray();
int[] letter = new int[26];
for(int cc : c){ letter[cc - 'a']++; }
for(int i = 0; i < 26; i++){ System.out.println((char)(i + 'a') + "=" + letter[i]); } }
|
排序
冒泡排序
可以看成向右看齐 一次次的筛选高个子 首先将高个子放在前面 然后在从剩下的里面继续找高个子
1 2 3 4 5 6 7 8 9 10 11
| public static void bubble(Integer[] arr){ for (int i = 0; i < arr.length; i++) { for(int j = 0; j < arr.length - i - 1; j++){ if(arr[j] > arr[j + 1]){ int temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } } }
|
选择排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
|
public static void selectSort(Integer[] arr){
for(int i = 0; i < arr.length; i++){ int min = i; int temp; for(int j = i + 1; j < arr.length; j++){
if(arr[min] > arr[j]){ temp = arr[min]; arr[min] = arr[j]; arr[j] = temp; } } }
}
|
插入排序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
| for(int i = 1; i < arr.length; i++){
if(arr[i] < arr[i - 1]){
int temp = arr[i]; int j;
for(j = i - 1; j >= 0&&temp<arr[j]; j--){ arr[j + 1] = arr[j]; } arr[j + 1] = temp; } }
|
查找
普通查找
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
|
public static int commonFind(int[] arr,int target){
int result = -1;
for (int i = 0; i < arr.length; i++) { if (arr[i] == target){ result = arr[i]; break; } }
return result; }
|
二分法查找
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
|
public static int binarySearch(int[] arr, int target){
int begin = 0; int end = arr.length - 1;
while (begin <= end){
int indexMiddle = (begin + (end - begin) >> 1);
if(target > indexMiddle){ begin = indexMiddle + 1; }else if(target < indexMiddle){ end = indexMiddle - 1; }else{ return indexMiddle; } } return -1; }
|
Arrays类
java.util.Arrays包下
数组相关的工具类
sort()
排序 (快速排序)
parallelSort()
部分数组进行排序
binarySearch()
二分法查找
equals()
检测两个数组是否相等
fill()
填充整个数组或部分数组
toString
返回一个字符串
二维数组
数组的声明
数组的初始化
1
| 数据类型[][] arr = new 数据类型[数组行大小][数组列大小];
|
数组列大小可以不写 但是数组行大小必须写
在坐标轴上找到两点间距离最小的两个点的坐标
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42
| public static void main(String[] args) {
double[][] arr = { {1,1}, {2,2}, {13,12}, {1,2}, {2,3}, {3,3}, {11,11}, {13,13}, {15,12}, {0.5,1} }; double min = Double.MAX_VALUE; int mini = 0; int minj = 0; for(int i = 0; i < arr.length; i++){ for(int j = i + 1; j < arr.length; j++){ double x1 = arr[i][0]; double x2 = arr[j][0]; double y1 = arr[i][1]; double y2 = arr[j][1]; double dis = Math.sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2)); if(dis < min){ min = dis; mini = i; minj = j; } } } System.out.println("最小距离" + min + " mini:" + mini + " minj:" + minj); }
|
你懂得越多 你不懂的越多 嘿 我是小博 带你一起看我目之所及的世界……