算法通关村--------不简单数组的增删改查

数组

数组存储时,是一片连续的存储空间。每一个元素占用相同的内存大小。

数组的空间不一定是满的。假设你创建一个长度为100的数组,但是以实际存储的元素只有10个,那么此时,数组的长度length→100,存储的元素个数 size → 10。

数组存储元素的特征

创建一个数组,数组里面装的是什么?

在java中默认初始化为0

数组一旦创建,长度是固定的。

我们将数组中的元素删除,其实只是将后面的元素往前挪动。可以理解为后面的往前覆盖了要删除元素的位置。

  int[] arr = {1,2,3,4,5,6}

如果我要把 2 删除了,那么我想问原来6的位置的元素是什么? int[] arr = {1,3,4,5,6,?}

其实6的位置上还是6,我们是通过size 来标记元素的数量的。所以说最后一个6是访问不到的。

数组的基本操作

查找一个元素

  
  /**
   * 在数组中查找元素
   * @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 element  要插入的元素
   * @param size 数组中元素的个数
   * @return
   */
  public static int addByElement(int[] arr,int element,int size) {
      //异常情况,数组长度是固定,存储的元素不能大于数组的最大长度
      //这里等于不能插入是因为,size是从1开始编号 数组长度也是从1开始 他们相等的时候,数组已经满了,所以不能在插入元素了
      if (size >= arr.length) {
          return -1;
      }
      //首先找到要插入的位置
      int index = size;
      for (int i = 0; i < arr.length; i++) {
          if (element < arr[i]) {
              index = i;
              break;
          }
      }
      //将元素整体往右边移动
      for (int j = size; j > index; j--) {
          arr[j] = arr[j-1];
      }
      //插入元素
      arr[index] = element;
      return index;
  }

删除一个元素

先遍历查找要删除的元素是否存在。

  • 不存在 ,返回-1

  • 存在 ,返回要删除的位置

找到要删除的位置后,将右边的元素整体的往左边移动。

最后 数组元素的个数 size 减一

  
  /**
   * 在有序数组中删除一个元素
   * @param arr
   * @param size
   * @param element
   * @return
   */
  public static int removeByElement (int[] arr,int size,int element) {
      int index = -1;
      for (int i = 0;i < size;i++) {
          if (element == arr[i]) {
              index = i;
              break;
          }
      }
      if (index != -1) {
          for (int i = index + 1; i < size;i++) {
              arr[i -1] = arr[i];
          }
          //循环结束,数组中元素的个数少一个
          size--;
      }
      return size;
  }

数组单调问题

力扣 896 判断一个给定的数组是否为单调数组。

. - 力扣(LeetCode)

      public static boolean isMonotonic (int[] arr) {
          //单调无非是两种情况
          //递增
          boolean inc = true;
          //递减
          boolean dec = true;
          for (int i = 0; i < arr.length -1; i++) {
              //如果前一个比后一个要小, 1 3 5 7说明是递增的
              if (arr[i] < arr[i + 1]) {
                  //将递减true → false
                  dec = false;
              }
              //是递减的  10 9 8 7
              if (arr[i] > arr[i + 1]) {
                  inc = false;
              }
  ​
          }
          //如果是单调的话,两者中必然有一个是true 如果不是单调的话,必然两个都是false 结果也就是false
          return inc || dec;
  ​
      }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值