【漫画算法学习笔记】第二章——2.1数组

简介: 本篇博客总结了《漫画算法》第二章的知识点,并将数组的扩容封装成了工具类

数组

1、数组算法之插入中间值

1.1、固定容量插中间值

  • 编写工具类 ArrayUtil
package utils;

//数组算法之固定容量数组的中间值的插入
public class ArrayUtil {
    // private static int[] array;  //初始化一个数组
    private static int size = 0;  //数组实际存入的数据个数

/*
    //初始化ArrayUtil这个工具类 使用带参构造初始化 参数capacity为数组的容量
    public ArrayUtil(int capacity) {
        this.array = new int[capacity];
        size = 0; // size初始的个数为0
    }
*/


    /**
     * 数组固定容量插入中间值算法核心 插值
     *
     * @param index   元素插入的位置
     * @param element 插入的元素
     * @author BoBooY
     */
    public static void insert(int index, int element,int[] array) {
        //判断插入的数据下标是否超出范围
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException("超出数组实际元素范围!");
        }

        //从右想左循环遍历数组中的元素,将数组中 大于 插入元素的下标 的元素向右平移一个位置
        for (int i = size - 1; i >= index; i--) {
            array[i + 1] = array[i];
        }

        //将元素插入到数组中
        array[index] = element;

        //数组实际存入的元素数量 + 1
        size++;
    }

    //输出数组
    public static void output(int[] array) {
        for (int i : array) {
            System.out.print(i + " ");
        }
    }
}
  • 编写测试类 ArrayUtilTest
package utils;

public class ArrayUtilTest {
    public static void main(String[] args) {
        int[] array = new int[10];
        ArrayUtil.insert(0,1,array);
        ArrayUtil.insert(1,2,array);
        ArrayUtil.insert(2,4,array);
        ArrayUtil.insert(3,5,array);
        ArrayUtil.insert(4,6,array);
        ArrayUtil.insert(5,7,array);
        ArrayUtil.insert(6,8,array);

        ArrayUtil.insert(2,3,array); // 插入中间值
        ArrayUtil.output(array);
    }
}
  • 插入中间值(2,3)前的数组输出结果

在这里插入图片描述

  • 插入之后的结果

在这里插入图片描述

1.2、超容量插中间值

思路

超出数组的容量就给数组扩容

  • 封装数组扩容方法
//数组扩容
public static int[] resize(int[] array) {
    int[] arrayNew = new int[array.length * 2];
    //System.arraycopy(原数组,从原数组的哪个位置copy,新数组,从新数组的哪个位置开始粘贴,粘贴原数组多少长度)
    System.arraycopy(array, 0, arrayNew, 0, array.length);
    array = arrayNew;  //将新数组赋值给旧数组的引用
    return array;
}

1.3、数组删除元素

//删除数组元素
public static int[] delete(int[] array, int index) {
    //判断插入的数据下标是否超出范围
    if (index < 0 || index > size) {
        throw new IndexOutOfBoundsException("超出数组实际元素范围!");
    }
    for (int i = index; i < size - 1; i++) {
        array[i] = array[i + 1];
    }
    size--;
    return array;
}

1.4、数组插值完整工具类

package utils;

import java.util.Arrays;

//数组算法之固定容量数组的中间值的插入
public class ArrayUtil {
    // private static int[] array;  //初始化一个数组
    private static int size = 0;  //数组实际存入的数据个数

/*
    //初始化ArrayUtil这个工具类 使用带参构造初始化 参数capacity为数组的容量
    public ArrayUtil(int capacity) {
        this.array = new int[capacity];
        size = 0; // size初始的个数为0
    }
*/


    /**
     * 数组固定容量插入中间值算法核心 插值
     *
     * @param index   元素插入的位置
     * @param element 插入的元素
     * @author BoBooY
     */
    public static int[] insert(int index, int element, int[] array) {

        //判断实际元素数量是否超出数组容量
        if (size >= array.length) {
            array = resize(array);
            System.out.println("对数组扩容了");
            System.out.println("插入前的数组:" + Arrays.toString(array) + "size:" + size);
        }

        //判断插入的数据下标是否超出范围
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException("超出数组实际元素范围!");
        }

        //从右想左循环遍历数组中的元素,将数组中 大于 插入元素的下标 的元素向右平移一个位置
        for (int i = size - 1; i >= index; i--) {
            array[i + 1] = array[i];
        }

        //将元素插入到数组中
        array[index] = element;


        //数组实际存入的元素数量 + 1
        size++;
        System.out.println("插入后:" + Arrays.toString(array) + "size:" + size);
        return array;
    }

    //删除数组元素
    public static int[] delete(int[] array, int index) {
        //判断插入的数据下标是否超出范围
        if (index < 0 || index > size) {
            throw new IndexOutOfBoundsException("超出数组实际元素范围!");
        }
        for (int i = index; i < size - 1; i++) {
            array[i] = array[i + 1];
        }
        size--;
        return array;
    }

    //数组扩容
    public static int[] resize(int[] array) {
        int[] arrayNew = new int[array.length * 2];
        //System.arraycopy(原数组,从原数组的哪个位置copy,新数组,从新数组的哪个位置开始粘贴,粘贴原数组多少长度)
        System.arraycopy(array, 0, arrayNew, 0, array.length);
        array = arrayNew;  //将新数组赋值给旧数组的引用
        return array;
    }


    //输出数组
    public static void output(int[] array) {
        for (int i = 0; i < size; i++) {
            System.out.print(array[i] + " ");
        }
    }
}
  • 测试
package utils;

import java.util.Arrays;

public class ArrayUtilTest {
    public static void main(String[] args) {
        int[] array = new int[10];
        array = ArrayUtil.insert(0,1,array);
        array = ArrayUtil.insert(1,2,array);
        array = ArrayUtil.insert(2,4,array);
        array = ArrayUtil.insert(3,5,array);
        array = ArrayUtil.insert(4,6,array);
        array = ArrayUtil.insert(5,7,array);
        array = ArrayUtil.insert(6,8,array);
        array = ArrayUtil.insert(7,9,array);
        array = ArrayUtil.insert(8,10,array);
        array = array = ArrayUtil.insert(9, 11, array);
        array = array = ArrayUtil.insert(10,12,array);


        array = ArrayUtil.insert(2, 3, array);// 插入中间值

        System.out.println(Arrays.toString(array));
        ArrayUtil.output(array);
        System.out.println();

        //测试删除
        array = ArrayUtil.delete(array,2);
        System.out.println(Arrays.toString(array));
    }
}

在这里插入图片描述

目录
相关文章
|
1月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
37 0
|
3月前
|
算法 测试技术
【算法】二分算法——寻找旋转排序数组中的最小值
【算法】二分算法——寻找旋转排序数组中的最小值
|
3月前
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
|
25天前
|
算法 程序员 索引
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
栈的基本概念、应用场景以及如何使用数组和单链表模拟栈,并展示了如何利用栈和中缀表达式实现一个综合计算器。
25 1
数据结构与算法学习七:栈、数组模拟栈、单链表模拟栈、栈应用实例 实现 综合计算器
|
25天前
|
存储 算法 定位技术
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
这篇文章主要介绍了稀疏数组和队列的概念、应用实例以及如何使用数组模拟队列和环形队列的实现方法。
20 0
数据结构与算法学习二、稀疏数组与队列,数组模拟队列,模拟环形队列
|
5月前
|
存储 算法 Go
算法学习:数组 vs 链表
算法学习:数组 vs 链表
59 0
|
3月前
|
存储 算法 Java
深入算法基础二分查找数组
文章深入学习了二分查找算法的基础,通过实战例子详细解释了算法的逻辑流程,强调了确定合法搜索边界的重要性,并提供了Java语言的代码实现。
深入算法基础二分查找数组
|
3月前
|
算法
【Azure Developer】完成算法第4版书中,第一节基础编码中的数组函数 histogrm()
【Azure Developer】完成算法第4版书中,第一节基础编码中的数组函数 histogrm()
|
3月前
|
算法
【算法】模拟算法——外观数组(medium)
【算法】模拟算法——外观数组(medium)
|
3月前
|
算法
【算法】前缀和——除自身以外数组的乘积
【算法】前缀和——除自身以外数组的乘积