Tutte le domande dei nuovi arrivati su MQL4 e MQL5, aiuto e discussione su algoritmi e codici - pagina 142

 
Artyom Trishkin:

No :)))

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

è il numero di numeri dello stesso colore.

Alexey Kozitsyn intendeva: in un array ordinato.Numero massimo di valori identici in una sequenza?

 
Mislaid:
Array:

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

Ordinamento:
1,1,1,1, 1,2, 2, 3,3,4,4,5

L'output è 4 valori di numeri corrispondenti (il numero 5 in una singola copia non è un valore corrispondente)

 
Artyom Trishkin:
Array:

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

Ordina per:
1,1,1, 1,2, 2, 3,3,4,4,5

L'output è 4 valori di numeri corrispondenti (il numero 5 in una singola copia non corrisponde a nulla)

Si leggerebbe quindi all'incirca: determinare il numero di numeri nella sequenza che hanno duplicati.
 
Alexey Kozitsyn:
Allora suonerebbe qualcosa come: determinare il numero di numeri in una sequenza che hanno duplicati.
Forse. Al momento non si tratta della formulazione, ma della soluzione. Sono seduto qui a risolvere...
 
Artyom Trishkin:

Nessuno dei due.

Ci sono quattro numeri sconosciuti conosciuti. Devi trovare il numero di numeri ripetuti come nell'esempio del mio primo post.

Se l'ordine non è importante, i numeri sono interi e l'intervallo è noto, allora si può contare per O(size) semplicemente creando un array di contatori.

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]);

Altrimenti, ordinate davvero e da lì selezionate la sequenza più lunga di numeri identici.
 
Maxim Kuznetsov:

Se l'ordine non è importante, i numeri sono interi e l'intervallo è noto, allora si può calcolare per O(size) semplicemente creando un array di contatori.

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]);

Altrimenti, davvero - ordinate e da lì selezionate la sequenza più lunga di quelle identiche.
Quindi "altrimenti" è un array di numeri di qualsiasi tipo. Quindi è una funzione template. Bene e ordinare e cercare.
Tuttavia, lo sto facendo lentamente.
 
Artyom Trishkin:
Forse. Al momento non si tratta della formulazione, ma della soluzione. Sono seduto qui a risolvere...
È strano.
 
fxsaber:
Strano.
La tua opzione dà sempre 1. Ci vuole più tempo per capirlo che per inventarlo. Questa è tutta la stranezza ;)
 
Artyom Trishkin:
La tua opzione dà sempre 1. Ci vuole più tempo per capirlo che per inventarlo. Questa è tutta la stranezza ;)
Eseguirlo così com'è.
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));
}
Funziona.
 

Anche questo sembra esserlo:

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*/); // число|количество
}