自己写的,不一定对啊,若有错误,还请大佬多指导啊
Q1:给定一个数组,其中包含一些先升后降的整数序列,arr1,请找出其中的最大值,不能使用从头到尾遍历的方式。
Q2:找出下标m,n,即只需要m-n这个区间排好序,整个数组就是有序的
Q3: 随机打乱数组,不能用random函数
ackage test1;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;
import java.util.TreeMap;
import java.util.UUID;
public class demo2 {
public static void main(String[] args) {
int[] arr1 = {1,3,4,5,9,7,6,4,2};
int[] arr2 = {1,4,6,5,9,10};
int[] arr3 = {1,2,3,4,5,6,7,8,9,10};
//Q1:给定一个数组,其中包含一些先升后降的整数序列,arr1,请找出其中的最大值,不能使用从头到尾遍历的方式。
int arrMax = getArrMax(arr1);
System.out.println(arrMax);
//Q2:找出下标m,n,即只需要m-n这个区间排好序,整个数组就是有序的
int [] arr= findMinAndMaxIndex(arr2);
int firstIndex=arr[0];
int lastIndex=arr[1];
System.out.println(firstIndex);
System.out.println(lastIndex);
//Q3: 随机打乱数组
int[] randomArr = getRandomArr(arr3);
System.out.println(Arrays.toString(randomArr));
}
/**
* Q1:给定一个数组,其中包含一些先升后降的整数序列,arr1,请找出其中的最大值,不能使用从头到尾遍历的方式。
* @param arr0
* @return
*/
private static int getArrMax(int[] arr0) {
int[] arr = arr0;
Arrays.sort(arr);
return arr[arr.length-1];
}
/**
* Q2:找出下标m,即只需要m-n这个区间排好序,整个数组就是有序的
* 返回一个两个元素的数组,第一个值为排序起始值,第二个值为排序最大值。
* 注意:考虑递减情况
* @param arr0
* @return
*/
private static int[] findMinAndMaxIndex(int[] arr0){
int[] arr1 = {-1,-1};//初始化要返回的数据,若原数组为有序数组,则直接返回{-1,-1}
int m1=-1,n1=-1,m2=-1,n2=-1;
int length = arr0.length;
int[] arr = new int[length];
for (int i=0;i<length;i++) {
arr[i] = arr0[i];
}
//对arr排序
Arrays.sort(arr);
//按照递增的顺序找出m
for (int i=0;i<length;i++) {
if (arr0[i]!=arr[i]) {
m1=i;
break;
}
}
//按照递增的顺序找出n
for (int i=length-1;i>=0;i--) {
if (arr0[i]!=arr[i]) {
n1=i;
break;
}
}
//按照递减的顺序找出m
for (int i=0;i<length;i++) {
if (arr0[i] != arr[length-i-1]) {
m2=i;
break;
}
}
//按照递减的顺序找出n
for (int i=length-1;i>=0;i--) {
if (arr0[i]!=arr[length-i-1]) {
n2=i;
break;
}
}
//如果传入数组为有序数组,则直接返回arr1
//否则判断n-m的大小选择改变arr1
if (m1==-1||m2==-1) {
return arr1;
} else if ((n1-m1)<=(n2-m2)){
arr1[0]=m1;
arr1[1]=n1;
}else{
arr1[0]=m2;
arr1[1]=n2;
}
return arr1;
}
/**
* Q3: 随机打乱数组
* @param arr0
* @return
*/
private static int[] getRandomArr(int[] arr0) {
TreeMap<Integer, Integer> treeMap = new TreeMap<>();
ArrayList<Integer> list = new ArrayList<>();
int[] arr = new int[arr0.length];
for (int i=0;i<arr0.length;i++) {
treeMap.put(UUID.randomUUID().hashCode(), arr0[i]);
}
Collection<Integer> values = treeMap.values();
Iterator<Integer> iterator = values.iterator();
while(iterator.hasNext()) {
list.add(iterator.next());
}
for (int i=0;i<list.size();i++) {
arr[i] = list.get(i);
}
return arr;
}
}