算法通关村——了不起的数组

数组的基本操作

数组的创建和初始化

创建一维数组的方法:

  int[] arr  = new int[10];
  // 或者
  int[] nums = {2,6,3,5,62};

查找一个元素

为什么数组的题目特别多呢,因为很多题目本质就是查找问题,而数组是查找的最佳载体。很多复杂的算法都是为了提高查询效率,例如二分查找、二叉树、B+树、Hash和堆等等。另一方面很多算法问题本质上都是查找问题,例如滑动 窗口问题、回溯问题、动态规划问题等等都是在寻找那个目标结果。
这里只写最简单的方式,根据值是否相等进行线性查找

   /**
     * @param arr  原始数组
     * @param size 数组已经存储的元素熟练,从1开始编号
     * @param key  待查找的元素
     * @return int
     */
    public static int findByElementSequence(int[] arr, int size, int key) {

        if (size > arr.length) {
            return -1;
        }
        for (int i = 0; i < size; i++) {
            if (arr[i] == key) {
                return i;
            }
        }
        return -1;

    }

增加一个元素

将给定的元素插入到有序数组的对应位置中,我们可以先找位置,再将其后元素整体右移,最后插入到空位置上。这里需要注意,算法必须能保证在数组的首部、尾部和中间位置插入都可以成功。

 /**
   * @param arr     原始数组
   * @param size    数组已经存储的元素熟练,从1开始编号
   * @param element 待插入的元素
   * @return int
   */
  public static int addByElementSequence(int[] arr, int size, int element) {
      if (size > arr.length) {
          return -1;
      }
      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];
      }
      arr[index] = element;
      return index;
  }

删除一个元素

对于删除,不能一边从后向前移动一边查找了,因为元素可能不存在。
所以要分为两个步骤,先从最左侧开始查是否存在元素,如果元素存在,则从该位置开始执行删除操作。
例如序列是 1 2 3 4 5 6 7 8 9 ,要删除5,则应先遍历,找到5,然后从5开始执行删除操作,也就是从6开始逐步覆盖上一个元素,最终将序列变成1 2 3 4 6 7 8 9 [9]

删除的元素并不会消失,只不过是访问不到了,例如此时的[9]

 /**
     * @param arr  原始数组
     * @param size 数组已经存储的元素熟练,从1开始编号
     * @param key  要删除的元素
     * @return int
     */
    public static int removeByElementSequence(int[] arr, int size, int key) {
        if (size > arr.length) {
            return -1;
        }
        
        int index = -1;
        // 查找到要删除的元素并记录其下标
        for (int i = 0; i < size; i++) {
            if (arr[i] == key) {
                index = i;
                break;
            }
        }

        if (index != -1) {
            for (int i = index + 1; i < size; i++) {
                arr[i - 1] = arr[i];
                size--;
            }
        }
        return size;
    }

相关代码链接

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值