本期我们来到数组模块,今天先夯实好基础
1.查找一个元素
2.增加一个元素
3.删除一个元素
一、查找一个元素
很多题目本质就是查找问题,而数组是查找的最佳载体。
来,上代码~
/**
* @param size 已经存放的元素个数
* @param key 待查找的元素
*/
public static int findByElement(int[] arr, int size, int key) {
for (int i = 0; i < size; i++) {
if (arr[i] == key)
return i;
}
return -1;
}
这段代码很简单,没有需要特别注意的点,记住就行。
二、增加一个元素
增加和删除元素是数组最基本的操作,看别人的代码非常容易,但是自己写的时候经常bug满天飞。
看了算法知识库的原代码后,我又自己敲了一遍。方便给大家阅读,我就上原代码吧~
/**
* @param arr
* @param size 数组已经存储的元素数量,从1开始编号
* @param element 待插入的元素
* @return
*/
public static int addByElementSequence(int[] arr, int size, int element) {
//问题①:是否应该是size>arr.length
if (size >= arr.length)
retrun -1;
//问题②想想这里是否是index=0或者size-1?
int index = size;
//找到新元素的插入位置,问题③ 这里是否应该是size-1?
for (int i = 0; i < size; i++) {
if (element < arr[i]) {
index = i;
break;
}
}
//元素后移,问题④想想这里为什么不是size-1
for (int j = size; j > index; j--) {
arr[j] = arr[j - 1]; //index下标开始的元素后移一个位置
}
arr[index] = element;//插入数据
return index;
}
代码注释中有 4 个问题,大家自己在编写代码时需要好好思考,可能一个不慎,bug就层出不穷。
下面这 4 个问题我一一来解答。
问题①:是否应该是size>arr.length?
条件就是 size >= arr.length
而不是 size > arr.length
。这是因为 size
表示已经存储的元素数量,从1开始编号,当 size
等于 arr.length
时,数组已经满了,不能再插入新元素。
问题②:想想这里是否是index=0或者size-1?
这里 index
的初始值应该是 size
,因为你要在已有元素的序列中找到新元素的插入位置,新元素应该插入到已有元素之后。所以 index
的初始值应该是 size
而不是 0 或 size - 1
。
问题③ :找到新元素的插入位置,这里是否应该是size-1?
在找到新元素的插入位置时,这里不需要是 size - 1
,因为你要找的位置是在已有元素序列中,而不是在整个数组中。所以只需要遍历到 size - 1
。
问题④:元素后移,想想这里为什么不是size-1
元素是整体往后移动,原本最后一个元素的下标是size-1,往后移一位就是size了,所以这里 j 刚开始的值时size,也就是最后一个元素移动后的下标。
三、删除一个元素
对于删除,不能一边从后向前移动一边查找了,因为元素可能不存在。
所以要分为两个步骤,先从最左侧开始查是否存在元素,如果元素存在,则从该位置开始执行删除操作。
上代码~
/**
* 从数组中删除元素 key
* @param arr 数组
* @param size 数组中的元素个数,从1开始
* @param key 删除的目标值
* @return 返回删除元素后的新数组大小
*/
public int removeByElement(int[] arr, int size, int key) {
// 初始化索引为 -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;
}
理解了增加一个元素之后,删除一个元素也不会太难,重要的是自己要动手写一遍才知道自己有没有问题。
以上三个都是数组的基本操作,要熟记~