算法通关村第三关 | 不简单的数组增删改查 | java

73 阅读2分钟

1.查找一个元素

最简单的方式是通过值是否相等来进行线性查找

/**  
* @param arr  数组
* @param size 已经存放的元素容量  
* @param key 待查找的元素  
* @return  
*/  
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;  
}

若数组是递增数组,此时查找时如果相等或者当前位置元素比目标元素大时我们可以进行优化,停止遍历

/**  
* @param arr  数组
* @param size 已经存放的元素容量  
* @param key 待查找的元素  
* @return  
*/  
public static int findByElement(int[] arr, int size, int key) {  
    for (int i = 0; i < size; i++) {  
        if (arr[i] == key)  
            return i;
        if(arr[i] > key)
            break;
    }  
    return -1;  
}

2.增加一个元素

将给定的元素插入到有序数组的对应位置中。处理好游标和边界情况很重要

/**  
* @param arr  数组
* @param size 数组已经存储的元素数量  
* @param element 待插入的元素元素  
* @return  元素插入位置
*/  
public static int addByElementSequence(int[] arr, int size, int element) {  
    //防止下标越界
    if (size >= arr.length)  
        throw new IllegalArgumentException("Add failed. Array is full.");  
    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]; //index下标开始的元素后移一个位置  
    }
    arr[index] = element;//插入数据  
    return index;  
}

上述思路需要遍历两次,我们可以直接从数组后端开始遍历,一边后移一边插入,只需遍历一次

/**  
* @param arr  数组
* @param size 数组已经存储的元素数量  
* @param element 待插入的元素元素  
* @return  元素插入位置
*/  
public static int addByElementSequence(int[] arr, int size, int element) {  
    //防止下标越界
    if (size >= arr.length)  
        throw new IllegalArgumentException("Add failed. Array is full.");  
    int index = 0;  
    for(int i=size;i>0;i--){  
        if(arr[i-1] < element){  
            index = i;  
            break;  
        }  
        arr[i] = arr[i-1]; //后移  
    }
    arr[index] = element;//插入数据  
    return index;  
}

3.删除一个元素

找到待删元素并返回数组长度(size),思路很简单,直接遍历一遍,下标元素等于目标值就返回size-1,找不到返回size。

/**  
* 遍历数组,如果发现目标元素,则将其删除,  
* 数组的删除就是从目标元素开始,用后续元素依次覆盖前继元素  
*  
* @param arr 数组  
* @param size 数组中的元素个数  
* @param key 要删除的目标值  
*/  
public static int removeByElement(int[] arr, int size, int key) {  
    int index = -1; 
    for (int i = 0; i < size; i++) {  找到删除元素下标
        if (arr[i] == key) {  
            index = i;  
            break;  
        }  
    }  
    if (index != -1) {  //往前覆盖
        for (int i = index; i < size - 1; i++) {  
            arr[i] = arr[i + 1];  
        }  
        --size;  
    }  
    return size;  
}