- 只是使用其中包含數組的索引值作爲鍵和其出現的次數作爲值的HashMap中。
- 在遍歷for循環時更新HashMap,方法是檢查當前索引是否已存在於HashMap中。然後,如果它在哈希映射中發現了兩倍,並查看它已經發生了多少次,並將其重新放回到HashMap中,並再發生一次。
- 我是用Java做的,因爲這就是它看起來像你使用的。還有一個好處是,時間複雜度爲O(n),這是您可能獲得的最佳情景,因爲您必須至少訪問一次元素。
- 所以如果你有這樣的雙打數組:{1,2,3,1,1,1,5,5,5,7,7,7,7,7,7,7,7 ,7} 然後,在末尾哈希映射將如下所示:{1-> 4,2-> 1,3-> 1,3,5,7,7> 9} 意思是「1發生了4次,2發生1次.... 7發生9次」等的
public static double mode(double [] arr)
{
HashMap arrayVals = new HashMap();
int maxOccurences = 1;
double mode = arr[0];
for(int i = 0; i<arr.length; i++)
{
double currentIndexVal = arr[i];
if(arrayVals.containsKey(currentIndexVal)){
int currentOccurencesNum = (Integer) arrayVals.get(currentIndexVal);
currentOccurencesNum++;
arrayVals.put(currentIndexVal, currentOccurencesNum);
if(currentOccurencesNum >= maxOccurences)
{
mode = currentIndexVal;
maxOccurences = currentOccurencesNum;
}
}
else{
arrayVals.put(arr[i], 1);
}
}
return mode;
}
來源
2011-08-21 23:56:52
Ray
感謝您的回覆。我能夠使用for循環找出它。 – jlss4e
public static double mode(double [] arr) \t { \t \t double loc = 0,val = -1; \t \t \t 爲\t(INT I = 1;我 LOC) \t \t \t { \t \t \t \t VAL = ARR [I]; \t \t \t \t loc = count; \t \t \t} \t \t} \t \t \t {\t \t \t \t \t } \t \t \t \t \t \t 返回\t VAL; –
jlss4e
是的jlss4e你的確可以工作,但它必須將每個元素與每個其他元素進行比較,因爲嵌套for循環。所以它必須運行n *(n-1)次。所以如果有100個輸入,它將不得不跑100 * 99次。如果你不擔心性能,它似乎是完美的 - - ) – Ray