MQL4、MQL5に関する初心者からの質問、アルゴリズムやコードに関するヘルプ、ディスカッションなど。 - ページ 142

 
Artyom Trishkin:

いいえ :)))

1,1,1,2,3,3,2,1,4,4,5

は同じ色の数字の数です。

Alexey Kozitsynの 意味:ソートされた配列の中で連続して同じ値を持つ最大数?

 
Mislaid:
アレイです。

1,1,1,2,3,3,2,1,4,4,5

ソートする。
1,1,1,1, 1,2, 2, 3,3,4,4,5

出力は4つの数字のマッチング値です(1つのインスタンスの数字5はマッチング値ではありません)。

 
Artyom Trishkin:
アレイです。

1,1,1,2,3,3,2,1,4,4,5

並び順はこちら
1,1,1, 1,2, 2, 3,3,4,4,5.

出力は4つの数字のマッチング値です(1コピーの5という数字は何もマッチングしていません)

そうすると、「数列の中で重複している数字の数を決める」という大まかな内容になります。
 
Alexey Kozitsyn:
そうすると、「数列の中で重複している数字の数を求めよ」というような意味になります。
そうかもしれませんね。今のところ文言の問題ではなく、解決策を考えています。私はここに座って、解決しています...
 
Artyom Trishkin:

どちらでもない。

既知の未知数は4つある。最初の投稿に ある例のように、繰り返される数字の数を求める 必要があります。

もし順番が重要でなく、数字が整数で、範囲が分かっていれば、カウンターの配列を作るだけでO(size)で数えることができます。

ArrayResize(counter,100);

ArrayInitialize(counter,0);

for(int i=ArraySize(source)-1;i>=0;i--) {

   counter[source[i]]‌++;

}

int pos=ArrayMaximum(counter);‌

‌PrintFormat("Чаще всего встречалось число %d, аж %d раз",pos,source[pos]);

そうでない場合は、本当にソートして、そこから最も長い同一数字の列を選択します。
 
Maxim Kuznetsov:

もし順番が重要でなく、数値が整数で、範囲が分かっていれば、カウンタの配列を作るだけでO(size)で計算できるのです。

ArrayResize(counter,100);

ArrayInitialize(counter,0);

for(int i=ArraySize(source)-1;i>=0;i--) {

   counter[source[i]]‌++;

}

int pos=ArrayMaximum(counter);‌

‌PrintFormat("Чаще всего встречалось число %d, аж %d раз",pos,source[pos]);

そうでなければ、本当に-ソートして、そこから同じものが一番長く続いているものを選んでください。
つまり、"otherwise "は任意の型の数値の配列である。つまり、テンプレート機能ですね。まあとソートして検索。
ただし、ゆっくりやっています。
 
Artyom Trishkin:
そうかもしれませんね。今のところ文言の問題ではなく、解決策を考えています。私はここに座って、解決しています...
変な感じです。
 
fxsaber:
それは変ですね。
あなたのオプションは常に1が出ます。自分で考えるより時間がかかる。以上、変な話でした ;)
 
Artyom Trishkin:
あなたのオプションは常に1が出ます。自分で考えるより時間がかかる。以上、変な話でした ;)
そのまま実行すること。
template <typename T>
int Strange( const T &InArray[] )
{
  int Res = 1;  
  
  T Array[];
  
  const int Size = ArraySize(InArray);
  
  if ((ArrayCopy(Array, InArray) == Size) && ArraySort(Array))
  {    
    int Tmp = 1;
    
    ArrayPrint(Array);
    
    for (int i = 1; i < Size; i++)
    {
      if (Array[i - 1] != Array[i])
      {
        if (Tmp > Res)
          Res = Tmp;
        
        Tmp = 0;
      }
        
      Tmp++;
    }
  }

  return(Res);
}

void OnStart()
{
  int Array[] = {1, 2, 3, 1, 2, 1, 2, 2};
  
  Print(Strange(Array));
}
効くんです。
 

こちらもそうみたいですね。

void OnTick()
{
int Arr[]={1, 2, 4, 4, 2, 1, 2, 2, 1, 4, 1, 4, 3, 3, 3, 4, 3, 3, 1, 3, 4, 3, 3};
Comment( GetM(Arr) );
}

int GetM(int &Mas[])
{
int c=0,cd=0,res=-1;

ArraySort(Mas);
int ArrSize= ArraySize(Mas);
  for(int i=0; i<ArrSize; i++) {
   for(int x=i; x<ArrSize; x++) {
    if(Mas[i]==Mas[ArrayMinimum(Mas,WHOLE_ARRAY,x)]) c++;
   }
    
   if(c>=cd) { // ищем первое большее ">" или максимально большее ">=" при одинаковом количестве
     cd=c; // количество совпадений
     res=Mas[i]; // число
   }
   c=0;
  }
  return( res /*cd*/); // число|количество
}