Solidity

在solidity中計算數組中最頻繁的值

  • January 22, 2020

我有一個類似的數組

$$ 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數組開頭,您可以簡單地保留最大計數及其相應的值。

引用自:https://ethereum.stackexchange.com/questions/79201