[英]Java arrays question with multiple answers
我在codewars有一個 java 問題。 開始!
在這個 kata 中,您將編寫一個 function,它返回數值數組的“峰值” (或局部最大值)的位置和值。
例如,數組arr = [0, 1, 2, 5, 1, 0]
在position 3
處有一個峰值, value of 5
(因為 arr[3] 等於 5)。
output 將以Map<String,List>with two key-value pairs:"pos"and"peaks".
如果給定數組中沒有峰值,只需返回 `{"pos" => [], "peaks" => []}。
示例: pickPeaks([3, 2, 3, 6, 4, 1, 2, 3, 2, 1, 2, 3])
應該返回{pos: [3, 7], peaks: [6, 3]}
(或其他語言的等價物)
所有input arrays will be valid integer arrays
(盡管它仍然可能為空),因此您不需要驗證輸入。
數組的第一個和最后一個元素不會被視為峰值(在數學 function 的上下文中,我們不知道之后和之前是什么,因此我們不知道它是否是峰值)。
另外,當心高原! [1, 2, 2, 2, 1]
有一個峰值,而[1, 2, 2, 2, 3]
和[1, 2, 2, 2, 2]
沒有。 如果出現高原峰值,請僅返回 position 和高原開始的值。 例如: pickPeaks([1, 2, 2, 2, 1])
返回{pos: [1], peaks: [2]}
(或其他語言的等價物)
玩得開心!
這是我的答案。
public static Map<String, List<Integer>> getPeaks(int[] arr) {
HashMap<String, List<Integer>> stringListHashMap = new HashMap<>();
List<Integer> positions = new ArrayList<>();
List<Integer> values = new ArrayList<>();
values.add(arr[1]);
positions.add(1);
for (int i = 2; i < arr.length - 1; i++) {
if (values.get(values.size() - 1) < arr[i]) {
values.clear();
positions.clear();
values.add(arr[i]);
positions.add(i);
}
}
stringListHashMap.put("pos", positions);
stringListHashMap.put("peaks", values);
return stringListHashMap;
}
上面的代碼工作正常,但我沒有通過單元測試,因為這個 ->應該支持找到預期的峰值:<{pos=[3, 7], peaks=[6, 3]}> 但是:<{pos =[3],峰=[6]}>
我已將問題縮小到此 ->示例: pickPeaks([3, 2, 3, 6, 4, 1, 2, 3, 2, 1, 2, 3])
應該返回{pos: [3, 7], peaks: [6, 3]}
(或其他語言的等價物)
顯然只有一個峰值是 6,它的指數是 3。那么問這個問題的人想說什么? 我覺得我錯過了什么
解決它的樂趣。 回答然后拒絕投票,而不是相反。
問題是要求局部最大值,而不是全局最大值。 如果一個值大於它的鄰居(並且不是第一個或最后一個值),那么它就是一個峰值,即使其他地方還有一個更大的值。 因此,對於輸入[3, 2, 3, 6, 4, 1, 2, 3, 2, 1, 2, 3]
,第三個值(位置 7)是一個峰值,因為值 3 大於兩者前面的鄰居 (2) 和后面的鄰居 (2)。
晚上放松的好任務。
所以據我了解,山頂被山谷包圍。 因此,如果 go 上升而不是下降,則您有一個峰值,如果您再次 go 上升和下降,您將有另一個峰值。 如果你 go 向上和水平而不是向下,首先 position 是高峰,你只是走在高原上。 這就像當你 go 山。 您可以一次攀登 2 或 3 座山峰。
這是解決方案:
public static Map<String, List<Integer>> getPeaks(int[] arr) {
Map<String, List<Integer>> result = new HashMap<>();
int peak = 0;
for (int i = 1; i < arr.length - 1; i++) {
if (arr[i-1] < arr[i]){
peak = i;
}
if(arr[i] > arr[i+1] && peak !=0) {
result.computeIfAbsent("pos", k -> new ArrayList<>()).add(peak);
result.computeIfAbsent("peaks", k -> new ArrayList<>()).add(arr[i]);
peak = 0;
}
}
return result;
}
我必須保持當前的峰值,因為你可以 go 水平,當你達到峰值時我們首先需要 position。 當我 go 下降時,我將其重置。 所以如果arr[i-1] < arr[i]
這意味着我達到了一個高峰,如果arr[i] > arr[i+1] && peak !=0
這意味着我下降了。
再提一下,使用 Map 作為參考,而不是 HashMap。 與您繼續進行列表相同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.