数组增删虽然简单,但实现的时候会有很多坑等着你。一起看看实现过程中的细节,准确处理游标和边界情况。
/** * 在一个递增的有序数组中插入一个元素 * * @param arr 待插入元素的数组 * @param size 数组中已有元素个数(区分于数组长度) * @param key 待插入元素的值 * @return 插入元素在新数组中的下标,如果数组已满则返回-1 */ public static int insertAnElement(int[] arr, int size, int key) { if (size >= arr.length) { return -1;//如果数组中存放元素数超过或者等于了数组大小,就不能插入元素了,返回-1 } int index = size;//index是待插入元素在新数组中的下标 //如果判断都大于原数组中元素就插入到size索引的位置,所以初始化为size //遍历原数组中所有元素,如果key>元素就与下一个比,一直到key<当前元素 //那么这个当前元素的下标就是key要插入的位置,保存当前待插入位置的索引。 for (int i = 0; i < size; i++) { if (key <= arr[i]) { index = i; break; } } //然后腾出空间(把后面的元素全部向后挪动一位) for (int i = size; i > index; i++) { arr[i] = arr[i - 1]; } //问:为什么要从下标size,也就是从后往前遍历? //答:如果从前往后遍历,用arr[i+1] = arr[i],那么你会发现所有元素都变成了同一值 //所以必须从后往前遍历 //最后把元素插进去 arr[index] = key; return index; }
/** * @param arr 待删除元素的数组 * @param size 存放元素个数 * @param key 删除元素值 * @return 删除后新数组存放元素个数 */ public static int deleteAnElement(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) {//index != -1代表数组中确实有与key值相等的元素,删除该元素 //删除该元素也就是从该元素的后一位起往前挪一位覆盖原来的元素 //原来有size个元素,下标从0到size-1,所以一直到下标size-2都要拿后一位元素的值 //此时应该从前往后遍历 for (int i = index; i < size - 1; i++) { arr[i] = arr[i + 1]; } size--; } return size; }