一、数组介绍
数组和链表一样是一种线性的数据结构,它的特点主要有两个:长度固定和空间连续。相对链表来说,数组的查询速度较快,这是它的优势。在算法中,数组是一些高级算法的载体,它最容易出错,也是最恶心的地方就是它的边界条件。下面我们首先研究下数组的插入和删除,需要特别注意的就是它的边界条件。
二、数组插入元素
/**
* 在单调递增数组插入元素
*
* @param nums 单调递增的数组
* @param size 数组已经存储的元素数量,从1开始
* @param element 要插入的元素
* @return 插入新元素后的数组
*/
private static int insertSequenceArray(int[] nums, int size, int element) {
// 如果数组的大小小于 size + 1,说明数组已经无法添加元素
if (nums.length <= size) {
return -1;
}
int index = size;
for (int i = 0; i < size; i++) {
if (nums[i] > element) {
index = i;
break;
}
}
// 移动数据
for (int i = size; i > index; i--) {
nums[i] = nums[i - 1];
}
// 插入数据
nums[index] = element;
size++;
return index;
}
三、数组删除元素
数组删除元素后,原数组存储最后一个元素的位置有两种处理,一是保持不变,二是设置成初始值。此处选择第二种处理方式。
/**
* 删除数组中的元素
*
* @param nums 原始数组
* @param size 数组已经存储的元素数量,从1开始
* @param element 待删除的元素值
* @return 新的数组
*/
private static int removeElement(int[] nums, int size, int element) {
int index = -1;
// 先查找目标
for (int i = 0; i < size; i++) {
if (nums[i] == element) {
index = i;
break;
}
}
// 删除
if (index != -1) {
for (int i = index; i <= size; i++) {
nums[i] = nums[i + 1];
}
size--;
}
return size;
}
以上皆为个人愚见,欢迎补充更好的方法~~ 如有不足之处,也请不吝赐教,帮忙指正,谢谢!