算法通关村第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. 题目:判断单调数组

 思路:

题目提示已经很清楚,只需循环两次分别判断是不是递增或者递减的,都不是就返回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. 题目:合并两个有序数组 

思路:

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

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

(3)从小往大判断,依次将元素后移,但是这样时间复杂度不够好,思考有没有什么优化的方法,想A数组后面是无元素空着的能不能从后面插入,自然就想到从大往小插入。

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值