《算法通关村——不简单的数组增删改查》

该博客聚焦算法中数组的操作,涵盖数组的创建、初始化、增删元素,还介绍了单调数组判断、二分查找找元素以及数组合并等问题,并给出相应代码解决方法。忽略了加入编程学习圈子等无关信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

《算法通关村——不简单的数组增删改查》

数组的创建和初始化

创建

int[] arr = new int[10];

赋值

/**
* method 1
*/
for ( int i = 0 ; i < arr.length ; i++){
    arr[i] = i;
}

/**
* method 2 
*/
int[] arr = new int[]{1,2,3,4,5,6,7,8};
int[] nums = {2,4,6,8,10}

添加元素

    /**
     * 添加一个元素
     *
     * @param arr     数组
     * @param size    数组实际元素个数
     * @param element 插入元素
     * @return 返回插入位置
     */
    public static int addElementSequence(int[] arr, int size, int element) {
        // 如果size大于等于arr.length 内存早就爆了。
        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 i = size; i > index; i--) {
            arr[i] = arr[i - 1];
        }
        arr[index] = element;
        return index;
    }

    /**
     * 一遍遍历插入元素
     *
     * @param arr
     * @param size
     * @param element
     * @return
     */
    public static int addElementSequence2(int[] arr, int size, int element) {
        if (size > arr.length) {
            return -1;
        }
        int i = size;
        for (; i > 0; i--) {
            if (arr[i - 1] < element) {
                arr[i] = element;
                return i;
            } else {
                arr[i] = arr[i - 1];
            }
            if (i == 1 && arr[0] > element) {
                arr[0] = element;
                return i;
            }
        }
        return i;
    }

删除元素

/**
     * 删除元素
     * @param arr
     * @param size
     * @param key
     * @return
     */
    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;
            }
        }
        if(index != -1 ){
            for(int i = index + 1 ; i < size; i++){
                arr[i-1] = arr[i];
            }
            size--;
        }
        return size;
    }

单调数组问题

描述

判断一个给定数组是否为单调数组

直接上代码

/**
     * 判断是否为有序序列
     * @param nums
     * @return
     */
    public static boolean isMonotonic(int[]nums){
        return isSorted(nums,true) || isSorted(nums,false);
    }
    public static boolean isSorted(int[] nums,boolean increasing){
        int n = nums.length;
        for(int i = 0 ; i < n-1 ; ++i){
            if(increasing){
                if(nums[i] > nums[i+1]){
                    return false;
                }
            }else{
                if(nums[i] < nums[i+1]){
                    return false;
                }
            }
        }
        return true;
    }

    /**
     * 判断是否为有序序列
     * @param nums
     * @return
     */
    public static boolean isMonotonic1(int[] nums){
        boolean inc = true,dec = true;
        int n = nums.length;
        for(int i = 0 ; i< n-1; i++){
            if(nums[i] > nums[i+1]){
                inc = false;
            }
            if(nums[i] < nums[i+1]){
                dec = false;
            }
        }
        return dec || inc   ;
    }

二分查找找元素

描述

给定一个排序数组和一个目标值,在数组中找到目标值,并返回索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。

示例:
输入:num = [1,3,5,6],target = 5
存在5,并且在索引为2的位置,所以输出2

示例:
输入:nums = [1,3,5,6], target = 2
不存在2,2插入后在索引为1的位置。

用二分法解决

public static int searchInsert(int[] nums,int target){
    int n = nums.length;
    int left = 0 ,right = n-1,ans = n;
    while(left<=right){
        int mid = ((right - left)>>1) + left    ;// 这里有个一个位操作 >>1 表示右移
        if(target <= nums[mid]){
            ans = mid;
            right = mid-1;
        }else{
            left = mid +1;
        }
    }
    return ans;
}

数组合并

描述

给你两个按非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。

例子1:
输入:nums1 = [1,2,3,0,0,0], m = 3, nums2 = [2,5,6], n = 3 
输出:[1,2,2,3,5,6] 
解释:合并 [1,2,3] 和 [2,5,6] 的结果是 [1,2,2,3,5,6]

代码解决

public static void merge(int[] nums1 , int nums1_len,int[] nums2,int nums2_len){
    int i = nums1_len + nums2_len - 1;
    int len1 = nums1_len-1,len2 = nums2_len-1;
    while(len1 >= 0 && len2 >= 0) {
        if (nums1[len1] <= nums2[len2]) {
            nums1[i--] = nums2[len2--];
        } else if (nums1[len1] > nums2[len2]) {
            nums1[i--] = nums1[len1--];
        }
    }
    //假如 A或者B数组还有剩余
    while(len2 != -1) nums1[i--] = nums2[len2--];
    while(len1 != -1) nums1[i--] = nums1[len1--];
}

近期在自学 Java 做项目,加入了一个编程学习圈子,里面有编程学习路线和原创的项目教程,感觉非常不错。还可以 1 对 1 和大厂嘉宾交流答疑,也希望能对大家有帮助,扫 ⬇️ 二维码即可加入。

在这里插入图片描述

也可以点击链接:我正在「编程导航」和朋友们讨论有趣的话题,你⼀起来吧?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xwhking

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值