算法通关村--数组青铜挑战

一、数组中插入元素

    public static int addByElementSequence(int[] arr, int size, int element) {
        if (size >= arr.length)//判断是否有足够位置插入
            return -1;
        int index = size;//index代表插入位置,初始值是nums1最后一个位置
        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]; //index 下标开始的元素后移一个位置
        }
            arr[index] = element;//插入数据
            return index;
  }

 二、删除元素

    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) {//从index+1开始将后面的元素前移
            for(int i=index+1;i<size;i++)
                arr[i-1] = arr[i];
            size-- ;
        }
        return size;
    }

三、数组合并

 两个数组都是升序的,“空位置”在nums1的后面,这里应该放两个数组中最大的那一些数。那么就从两个数组最后面开始比较,较大的放入空位。这样nums1中前面的位置就可以被覆盖了

    public void merge(int[] nums1, int m, int[] nums2, int n) {
        if(n==0)
            return;
        int last1=m-1;//指向nums1最大的还未进行合并的元素
        int last2=n-1;//指向nums2最大的还未进行合并的元素
        int i;
        for(i=m+n-1;i>=0&&last1>=0&&last2>=0;i--){//把最大的元素移动到最终位置
            if(nums1[last1]>=nums2[last2]){
                nums1[i]=nums1[last1];
                last1--;
            }
            else{
                nums1[i]=nums2[last2];
                last2--;                
            }
        }
            if(last1>=0){//循环结束检查是否有没合并的元素,将剩下的直接合并
                while(i>=0&&last1>=0){
                    nums1[i]=nums1[last1];
                    last1--;
                    i--;
                }
            }
            else if(last2>=0){//循环结束检查是否有没合并的元素,将剩下的直接合并
                while(i>=0&&last2>=0){
                    nums1[i]=nums2[last2];
                    last2--;
                    i--;
                }                
            }        
    }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值