我在Code Wars上进行了此练习,我已经解决了很多(我认为),但这不是效率最高的解决方案,我似乎找不到最佳的破解方法。
在此kata中,您将编写一个函数,该函数返回数字数组的“峰值”(或局部最大值)的位置和值。
例如,数组
arr = [0, 1, 2, 5, 1, 0]
在位置3
处有一个峰值,值为5
(因为arr[3]
等于5
)。输出将作为带有两个键值对的
Map<String,List<integer>>
返回:"pos"
和"peaks"
。如果给定阵列中没有峰,则只需返回{"pos" => [], "peaks" => []}
。示例:
pickPeaks([3, 2, 3, 6, 4, 1, 2, 3, 2, 1, 2, 3])
应该返回{pos: [3, 7], peaks: [6, 3]}
(或其他语言的等效语言)所有输入数组都是有效的整数数组(尽管它仍然可以为空),因此您无需验证输入。
数组的第一个和最后一个元素将不被视为峰(在数学函数的上下文中,我们不知道其前后是什么,因此,我们不知道它是峰还是峰不是)。
还要提防高原!
[1, 2, 2, 2, 1]
达到峰值,而[1, 2, 2, 2, 3]
没有达到峰值。如果是高峰期,请仅返回高原开始位置和位置。例如:pickPeaks([1, 2, 2, 2, 1])
返回{pos: [1], peaks: [2]}
(或其他语言的等效语言)
这是我在Java中的解决方案:
import java.util.*;
import java.util.List;
public class PickPeaks {
public static Map<String,List<Integer>> getPeaks(int[] arr) {
HashMap<String,List<Integer>> retVal = new HashMap<>();
ArrayList<Integer> peakArr = new ArrayList<Integer>();
ArrayList<Integer> posArr = new ArrayList<Integer>();
Get the size of the Array
int sizeArr = arr.length;
System.out.println(" sizeArr >> " + sizeArr);
while(sizeArr > 0){
for ( int index = 1; index < sizeArr; index++){
if((arr[index]) > (arr[index-1]) && (arr[index+1]) < (arr[index])){
System.out.println(" Peak >>> " + arr[index] + " Position >>> " + index);
posArr.add(index);
peakArr.add(arr[index]);
// Dealing with plateaus
}else if ((arr[index]) > (arr[index-1]) && (arr[index+1]) == (arr[index])){
posArr.add(index);
peakArr.add(arr[index]);
}
}
System.out.println("Pos Array >> "+ posArr +"Peak Array >> " + peakArr);
retVal.put("pos",posArr);
retVal.put("peaks",peakArr);
System.out.println("Retval >> " + retVal.toString());
}
return retVal;
}
}
答案 0 :(得分:0)
List<Integer> pos=new ArrayList<>(); List<Integer> pea=new ArrayList<>();
Map<String,List<Integer>> ma=new HashMap<String,List<Integer>>();
int cur=0,pre=0;
HashMap<String,Integer> hm=new HashMap<String,Integer>();
for(int a=1;a<arr.length;a++){
if(arr[a]>arr[cur] ){
pre=cur;cur=a;
}else{
if(arr[a]<arr[cur])
if(arr[pre]<arr[cur]){
pos.add(cur);pea.add(arr[cur]);}
pre=cur;cur=a;
}
}
ma.put("pos",pos);ma.put("peaks",pea);
return ma;