算法通关村第3关【青铜】| 不简单的数组增删改查

这篇具有很好参考价值的文章主要介绍了算法通关村第3关【青铜】| 不简单的数组增删改查。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1. 创建数组

        //第一种创建和初始化的方法
        int[] arr = new int[10];
        
        //第二种创建和初始化的方法
        int[] arr2 = new int[]{0, 1, 2, 3, 5, 6, 8};
        System.out.println("arr2:" + Arrays.toString(arr2));

        //第二种方式的简化版本:
        int[] arr3 = {2, 5, 0, 4, 6, -10};
        System.out.println("arr3" + Arrays.toString(arr3));

2. 查找一个元素

找到目标位置

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;
    }

3. 插入一个元素

先找到目标位置,再后移插入

public static int add(int[] arr, int size, int element) {
        //size和arr.length都表示元素的数量,都是从1开始编号
        if (size >= arr.length)
            throw new IllegalArgumentException("Add failed. Array is full.");
        int index = size;
        for(int i = 0;i<size;i++){
            if (element<arr[i]){
                index = i;
                break;
            }
        }
        for(int i = size;i>index;i--){
            arr[i] = arr[i-1];
        }
        arr[index] = element;
        return index;

    }

也可以边遍历边移动元素

public static int add(int[] arr, int size, int element) {
        //size和arr.length都表示元素的数量,都是从1开始编号
        if (size >= arr.length)
            throw new IllegalArgumentException("Add failed. Array is full.");
        int i;
        for(i = size;i>0;i--){
            if (element<arr[i-1]){
                arr[i] = arr[i-1];
            }else {
                arr[i] = element;
                return i;
            }
        }
        arr[i] = element;
        return i;
    }

4.删除一个元素

先找到目标位置,再覆盖

public static int removeByElement(int[] arr, int size, int key) {
        int index = -1;
        for (int i = 0; i < size; i++) {
            if (arr[i] == key) {
                index = i;
                break;
            }
        }
        size--;
        if (index != -1) {
//            for (int i = index + 1; i < size; i++)
//                arr[i - 1] = arr[i];
//            size--;
            for (int i = index;i<size;i++){
                arr[i] = arr[i+1];
            }
        }
        return size;
    }

5. 题目:判断单调数组

算法通关村第3关【青铜】| 不简单的数组增删改查,算法,算法,java,开发语言

 思路:

题目提示已经很清楚,只需循环两次分别判断是不是递增或者递减的,都不是就返回false。

也可以只遍历一次,当一次循环中既遇到递增又遇到递减情况就返回false。

class Solution {
    public boolean isMonotonic(int[] nums) {
        boolean isIncreasing = true;
        boolean isDeclining = true;
        for(int i = 1;i<nums.length;i++){
            if(nums[i]>=nums[i-1]){
                continue;
            }else{
                isIncreasing = false;
            }
        }
        for(int i = 1;i<nums.length;i++){
            if(nums[i]<=nums[i-1]){
                continue;
            }else{
                isDeclining = false;
            }
        }
        return isDeclining|isIncreasing;
    }
}

6. 题目:合并两个有序数组 

算法通关村第3关【青铜】| 不简单的数组增删改查,算法,算法,java,开发语言

思路:

(1)直接将B数组拼接到A数组后面,然后排序,但是这样不符合面试官出题考察点

(2)新建一个数组C,然后依次有序插入,有待优化空间

(3)从小往大判断,依次将元素后移,但是这样时间复杂度不够好,思考有没有什么优化的方法,想A数组后面是无元素空着的能不能从后面插入,自然就想到从大往小插入。文章来源地址https://www.toymoban.com/news/detail-654027.html

class Solution {
    public void merge(int[] nums1, int m, int[] nums2, int n) {
        int i = m+n -1;
        for(;i>=0&&n != 0&&m!=0;i--){
            if(nums1[m-1] >= nums2[n-1]){
                nums1[i] = nums1[m-1];
                m--;
            }else{
                nums1[i] = nums2[n-1];
                n--;
            }
        }
        while(n>0){
           nums1[i--] = nums2[--n]; 
        }
        
    }
}

到了这里,关于算法通关村第3关【青铜】| 不简单的数组增删改查的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 算法通关村第十六关:青铜挑战-滑动窗口其实很简单

    1. 滑动窗口基本思想 数组引入双指针的背景: 很多算法会大量移动数组中的元素,频繁移动元素会导致执行效率低下或者超时,使用两个变量能比较好的解决很多相关问题 数组双指针,之前介绍过 对撞型 和 快慢型 两种,滑动窗口思想就是快慢型的特例 滑动窗口 示例:

    2024年02月09日
    浏览(44)
  • 算法通关村|青铜挑战----链表

    前言:数据结构的基础:创建+增删改查 学习目标:单链表的创建+增删改查,双链表的创建+增删改查 数据域+指针域 数据域:当前节点的元素值 指针域:当前节点保存的下一个节点的元素的地址,其中最后一个元素的指针域指向null 标准的面向对象的节点的定义: LeetCode中节

    2024年02月15日
    浏览(36)
  • [Go版]算法通关村第一关青铜——链表青铜挑战笔记

    单向链表图示: 双向链表图示: 环形单向链表图示: 环形双向链表图示: 源码地址: GitHub-golang版本 如果是单向的,需要将当前节点 定位到要插入节点的前一个节点 ,否则一旦过了将无法回头找到前一个节点 如果是双向的,将当前节点 定位到要插入节点的前一个节点、

    2024年02月13日
    浏览(40)
  • 算法通关村第一关-链表青铜挑战笔记

    平时我们一般都是用数组,每个数组都会有一个相对应的索引,这样就使得数组能够方便的调用出对应索引得到需要的数据,但是这也造成了一个问题,那就是不好在数组中插入或者删除一个数据,例如 int arr[]={1,2,4,5}如果我想在数组中的2和4中添加一个数据3 那么我们首先就

    2024年02月15日
    浏览(43)
  • 算法通关村第一关——链表青铜挑战笔记

    链表的基本单元就是 节点 ,也就是说链表是由一个一个节点构成的。 而对于节点来说,里面至少会包含一个 指针 和一个 数据元素 ,也就是如下图所示: 其中数据域用来存放数据元素,指针域用来存放指向下一个节点的指针,这样一个一个连接起来的就是链表。如下图所

    2024年02月16日
    浏览(43)
  • 《算法通关村第一关——链表青铜挑战笔记》

    链表中每个结点内部的“生态环境”。 数据域存储元素的值,指针域存放指针。 示例: c语言构造链表 可分为三步 1.创建头指针。 2.创建头结点,使头指针指向头结点。 3.循环创建结点,并使前一个结点指向当前结点。 1.)创建结点。 2.)使前一个结点指向当前结点。 3.)

    2024年02月15日
    浏览(40)
  • 算法通关村第一关———链表青铜挑战笔记

    通过类来构建节点,用next指针将节点连起来。 会有插入位置的范围问题,不能超出链表范围 会有删除位置的范围问题 构造双向链表 插入和删除都有三种情况,头中尾  

    2024年02月15日
    浏览(44)
  • 算法通关村第一关--链表青铜挑战笔记

    开始时间:2023年7月16日20:45:26 什么是链表,链表是一种通过指针串联在一起的线性结构,每一个节点由两部分组成,一个是数据域一个是指针域(存放指向下一个节点的指针),最后一个节点的指针域指向null(空指针的意思)。 链表的入口节点称为链表的头结点也就是hea

    2024年02月17日
    浏览(44)
  • 算法通关村第一关 | 链表青铜挑战笔记

    一、 什么是链表? 链表是一种比较简单、很常见的数据结构,是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 二、链表的特点 链表是一种比较简单、很常见的数据结构,是线性表(List)的一种,是一种物理存

    2024年02月14日
    浏览(38)
  • 编程导航算法通关村第一关|青铜|链表基础

    JVM有栈区和堆区 栈区:存引用,就是指向实际对象的地址。。 堆区:存的是创建的对象。 定义 规范的链表定义 LeetCode算法题中常用 遍历 插入 删除 结点 结构遍历 插入 从头插入 从尾插入 从某个值为key的节点后面插入 删除 删除头结点 删除尾结点 按值删除

    2024年02月15日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包