数组的基本操作
数组的创建和初始化
创建一维数组的方法:
int[] arr = new int[10];
// 或者
int[] nums = {2,6,3,5,62};
查找一个元素
为什么数组的题目特别多呢,因为很多题目本质就是查找问题,而数组是查找的最佳载体。很多复杂的算法都是为了提高查询效率,例如二分查找、二叉树、B+树、Hash和堆等等。另一方面很多算法问题本质上都是查找问题,例如滑动 窗口问题、回溯问题、动态规划问题等等都是在寻找那个目标结果。
这里只写最简单的方式,根据值是否相等进行线性查找
/**
* @param arr 原始数组
* @param size 数组已经存储的元素熟练,从1开始编号
* @param key 待查找的元素
* @return int
*/
public static int findByElementSequence(int[] arr, int size, int key) {
if (size > arr.length) {
return -1;
}
for (int i = 0; i < size; i++) {
if (arr[i] == key) {
return i;
}
}
return -1;
}
增加一个元素
将给定的元素插入到有序数组的对应位置中,我们可以先找位置,再将其后元素整体右移,最后插入到空位置上。这里需要注意,算法必须能保证在数组的首部、尾部和中间位置插入都可以成功。
/**
* @param arr 原始数组
* @param size 数组已经存储的元素熟练,从1开始编号
* @param element 待插入的元素
* @return int
*/
public static int addByElementSequence(int[] arr, int size, int element) {
if (size > arr.length) {
return -1;
}
int index = size;
// 找到要插入位置的下标
for (int i = 0; i < size; i++) {
if (element < arr[i]) {
index = i;
break;
}
}
// 将数组向后移一位
for (int j = size; j > index; j--) {
arr[j] = arr[j - 1];
}
arr[index] = element;
return index;
}
删除一个元素
对于删除,不能一边从后向前移动一边查找了,因为元素可能不存在。
所以要分为两个步骤,先从最左侧开始查是否存在元素,如果元素存在,则从该位置开始执行删除操作。
例如序列是 1 2 3 4 5 6 7 8 9 ,要删除5,则应先遍历,找到5,然后从5开始执行删除操作,也就是从6开始逐步覆盖上一个元素,最终将序列变成1 2 3 4 6 7 8 9 [9]
删除的元素并不会消失,只不过是访问不到了,例如此时的[9]
/**
* @param arr 原始数组
* @param size 数组已经存储的元素熟练,从1开始编号
* @param key 要删除的元素
* @return int
*/
public static int removeByElementSequence(int[] arr, int size, int key) {
if (size > arr.length) {
return -1;
}
int index = -1;
// 查找到要删除的元素并记录其下标
for (int i = 0; i < size; i++) {
if (arr[i] == key) {
index = i;
break;
}
}
if (index != -1) {
for (int i = index + 1; i < size; i++) {
arr[i - 1] = arr[i];
size--;
}
}
return size;
}