Solidity
在solidity中計算數組中最頻繁的值
我有一個類似的數組
$$ 0,0,0,0,0,0,1,1,1,1,1,1,1,2,2,2,2,2,2 $$. 我想找到最常見的值。如果兩個以上的頻率最高,則應該是第一個出現的結果。我將它傳遞給函式以獲得結果。我不知道錯誤在哪裡,但結果不對。我的功能沒有按要求工作。
function mode(uint[] memory array) public pure returns(uint) { uint modeValue; uint[] memory count; uint number; uint maxIndex = 0; //uint zero=0; for (uint i = 0; i < array.length; i += 1) { number = array[i]; count[number] = (count[number]) + 1; if (count[number] > maxIndex) { maxIndex = count[number]; } } for (uint i =0;i<count.length; i++) if (count[i] == maxIndex) { modeValue=count[i]; break; } return modeValue; }```
您的技術錯誤是
uint[] memory count
未初始化,因此任何此類訪問嘗試count[number]
或count[i]
自然會導致您的功能恢復;你必須在輸入數組中找到最大值,然後初始化count = new uint[](maxInputValue + 1)
。你的邏輯錯誤是,而不是這個:
if (count[number] > maxIndex) { maxIndex = count[number]; }
你應該這樣做:
if (count[number] > count[maxIndex]) { maxIndex = number; }
您的概念錯誤(假設您的輸入數組按問題所示排序)是您不需要
count
數組開頭,您可以簡單地保留最大計數及其相應的值。