【算法基础】数组扩容、缩容

2023-03-04 13:35:47 浏览数 (1)

1. 数组扩容

问题: 现有数组 int[] arr = new int[]{1,2,3,4,5,6}; ,现将数组长度扩容1倍,并将7,8,9三个数据添加到arr数组中。

思路:

  1. 新建一个数组长度为arr的两倍
  2. 将arr的值复制到新数组
  3. 再新数组尾部追加数据
  4. 将新数组的指针指向arr
代码语言:javascript复制
    public static void main(String[] args) {
    
        int[] arr = new int[]{1,2,3,4,5,6};
			
		// 1. 新建一个数组长度为arr的两倍
		// int[] arr2 = new int[arr.length * 2];
        // 或 <<1 也表示乘以2,>>1表示除以2
        int[] arr2 = new int[arr.length << 1];

		// 注意终止条件
        for (int i = 0; i < arr.length; i  ) {
        	// 2. 将arr的值复制到新数组
            arr2[i] = arr[i];
        }

        // 3. 再新数组尾部追加数据
        arr2[arr.length] = 7;
        arr2[arr.length   1] = 8;
        arr2[arr.length   2] = 9;

        // 3.将arr2的指针指向arr,arr2会被垃圾回收期回收
        arr = arr2;
		
		//输出:1,2,3,4,5,6,7,8,9,0,0,0
    }
}

2. 数组缩容

问题: 现有数组 int[] arr={1,2,3,4,5,6,7}。现需删除数组中索引为4的元素。

方案1(推荐):不创建新数组

思路: 将值前移,最后一位,置为数组默认值。不创建新数组

代码语言:javascript复制
public static void main(String[] args) {
        // 删除4
        int[] arr = new int[]{1,2,3,4,5,6,7};

        // 方案1:将值前移,最后一位,置为数组默认值。不创建新数组
        int deleteIndex = 3;
        //注意终止条件
        for (int i = deleteIndex; i < arr.length -1; i  ) {
            arr[i] = arr[i 1];
        }
        // 最后一位,置为int默认值0
        arr[arr.length-1]=0;
		//输出:1,2,3,5,6,7,0
}

方案2:创建新数组

  1. 删掉4
  2. 创建一个长度为原数组长度 -1 的新数组
  3. 将数组复制到一个新数组
  4. 再将新数组指针只回原数组
一个for循环 if 条件
代码语言:javascript复制
public static void main(String[] args) {
		//方案2:删掉数据,将数组复制到一个新数组。创建新数组
        int[] arr1 = new int[]{1,2,3,4,5,6,7};
        int[] arr2 = new int[arr1.length - 1];

        for (int i = 0; i < arr1.length-1; i  ) {
		
			// // deleteIndex = 4 的时候不会复制
            if (i != deleteIndex) {
            	// deleteIndex < 4 走这里
                arr2[i] = arr1[i];
            }
            // deleteIndex > 4 走这里
            arr2[i]=arr[i];
        }
		
		// 将指针指回arr,arr1会被垃圾回收器回收
        arr1 = arr2;
        //输出:1,2,3,5,6,7
}
两个for循环实现
代码语言:javascript复制
public static void main(String[] args){
	int[] arr = new int[]{1,2,3,4,5,6,7};
	int[] arr1 = new int[arr.length - 1];
	
	int deleteIndex = 3;
	for(int i = 0; i < deleteIndex; i  ){
		arr1[i] = arr[i   1];
	}
	
	for(int i = deleteIndex; i < arr.length - 1; i  ){
		arr1[i] = arr[i];
	}
	
	// 将指针指回arr,arr1会被垃圾回收器回收
	arr = arr1;
	//输出:1,2,3,5,6,7
}

0 人点赞