簡體   English   中英

Java arrays 有多個答案的問題

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM