一、查
最简单的数组查方法就是遍历数组,算法模板如下:
public int search(int[] nums, int key){
for(int i = 0; i < nums.length; i++){
if(nums[i] == key){
return i;
}
}
return -1;
}
如果实在有序的数组中查找元素可以使用二分法(假设数组是递增数组),如果没有则返回插入位置的索引。
public int search(int[] nums, int key){
int left = 0;
int right = nums.length - 1;
int mid;
while(left < right){
mid = (left + right) >> 1;
if(key == nums[mid]){
return mid;
}else if(key > nums[mid]){
left = mid + 1;
}else if(key < nums[mid]){
right = mid - 1;
}
}
return mid;
}
二、增
数组的增操作是最基础的操作,但是里面还是有着许多的细节。(假设在一个递增数组)
/**
* @param nums 操作的数组
* @param size 数组内已存储的元素个数,以1开始计数
* @param key 需要插入的元素
* @return
*/
public int addArray(int[] nums, int size, int key) {
//如果数组存储的元素满了,则不可进行插入数组操作
if (size >= nums.length) {
return -1;
}
//假设key比数组中的值都大
//因为如果key比数组的最大值小可以在下面的循环中改变,而大就改变不了了
int index = size;
for (int i = 0; i < size; i++) {
if (key < nums[i]) {
index = i;
break;
}
}
//从后面往前替换,因为size的值从1开始,所以插入后的索引最大值也是size
for (int i = size; i > index; i--) {
nums[i] = nums[i - 1];
}
nums[index] = key;
return index;
}
三、删
/**
* 在数组中删除元素key
* @param nums
* @param size 数组内已存储的元素个数,以1开始计数
* @param key 需要删除的元素
* @return 删除后数组中存储的元素个数
*/
public int remove(int[] nums,int size,int key){
//假设删除的元素不存在
int index = -1;
//寻找key 的索引
for (int i = 0; i < nums.length; i++) {
if(nums[i] == key){
index = i;
break;
}
}
//如果index不是-1,说明key在数组中,需要执行删除操作
if (index != -1){
//这里很细节,为什么不是i = index
//如果数组中存储的元素是满的,在最后一个元素中会使用nums[size],这会导致空指针
for (int i = index + 1; i < size; i++) {
nums[i - 1] = nums[i];
}
size--;
}
return size;
}