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