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

1.问题:在有序数组中增加一个元素使数组仍有序

示例

输入:arr=[1,3,5,8,12,20,0,0],n=10,size=6;

输出:arr=[1,3,5,8,10,12,20,0];

注意:必须保证在数组的首部,尾部,中间位置都能够插入。

具体代码如下:

public class Test {
	public static void main(String[] args) {
		//arr为有序数组,size为数组中已存放元素的个数,n为添加的元素,index记录n存放位置的索引
		int[] arr = {1,3,5,8,12,20,0};
		int size =6;
		int n= 0;
		int index =size;
		for(int i=size-1;i>=0;i--) {
			if(arr[i]>n) {
				arr[i+1] = arr[i];
				index = i;
			}else {
				break;
			}
		}
		arr[index] = n;
	}
}

2.问题:在数组中删除一个指定的元素

输入:arr=[1,3,5,8,12,20],n=3;

输出:arr=[1,5,8,10,12,20,20];

注意:对于删除元素应该先查元素是否存在

具体代码如下:

public class Test {
	public static void main(String[] args) {
		//arr为有序数组,size为数组中已存放元素的个数,n为添加的元素
		//index记录n存放位置的索引,exist查找元素是否存在
		int[] arr = {1,3,5,8,12,20,0,0};
		int n =1;
		int size =6;
		int index = -1;
		boolean exist = false;
		//查找元素是否存在
		for(int i=0;i<size;i++) {
			if(arr[i] == n) {
				exist = true;
			}
		}
		//查找删除元素的索引
		if(exist) {
			for(int i=0;i<size;i++) {
				if(arr[i] == n) {
					index = i;
					break;
				}
			}
		}
		//将从索引位置开始挪动元素
		for(int k = index;k<size;k++) {
			arr[k] = arr[k+1];
		}
		size--;
	}
}

3.问题:判断一个数组是否为单调递增或递减

示例

输入:arr=[1,2,3,4,5,6]

输出:true

巧妙简化思路:

1.定义两个布尔类型的变量初始值都为true,分别用来表示递增inc=true和递减dec=true

2.循环遍历数组中的前arr.length-1的元素,与其前一个元素进行比较

3.如果比较结果大于则inc=false否则dec=false

4.返回 inc||dec;

具体代码如下:

public class Test {
	public static void main(String[] args) {
		int[] arr = {1,2,3,0,5,6};
		boolean inc = true;
		boolean dec = true;
		for(int i=0;i<arr.length-1;i++) {
			if(arr[i]>arr[i+1]) {
				inc = false;
			}else {
				dec = false;
			}
		}
		System.out.println(inc||dec);
	}
}

4.问题:如何将两个升序数组和并为一个升序数组

方法1思路:将数组B加到数组A的后面,再对数组A进行排序

方法2思路:创建一个新数组C,依次从A,B两个数组的第一位开始比较,最小的元素加入到数组C中

方法2的代码如下:

public class Test09 {
	public static void main(String[] args) {
		int[] a = {1,3,5,7,9};
		int[] b = {2,4,6,8,10};
        //标记当前比较A中元素的索引
		int aIndex = 0;
        //标记当前比较B中元素的索引
		int bIndex = 0;
		int[] c = new int[a.length+b.length];
		for(int i=0;i<c.length;i++) {
            //判断:当数组B已经全部加入到C中时将剩下A中元素依次加入到C中
            //或者,当A中还有元素没加入到C中且当前比较A中元素小,则将A中元素加入到C中
			if(bIndex == b.length || aIndex<a.length&&a[aIndex]<b[bIndex]) {
				c[i] = a[aIndex];
				aIndex++;
			}else{
				c[i] = b[bIndex];
				bIndex++;
			}
		}
	}
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值