Question

À partir d’une liste de mots de différentes longueurs, quel est le meilleur moyen de trouver la longueur maximale d’un mot?

Par exemple, les éléments suivants doivent renvoyer 6

findMaxLen("a,set,of,random,words")


Bien sûr, c'est assez trivial de le faire ...

<cffunction name="findMaxLen" returntype="Numeric">
    <cfset var CurMax = 0 />
    <cfset var CurItem = 0 />
    <cfloop index="CurItem" list="#Arguments[1]#">
        <cfif Len(CurItem) GT CurMax >
            <cfset CurMax = Len(CurItem)/>
        </cfif>
    </cfloop>
    <cfreturn CurMax />
</cffunction>


Ou, un peu plus court ...

<cffunction name="findMaxLen" returntype="Numeric">
    <cfset var CurMax = 0 />
    <cfset var CurItem = 0 />
    <cfloop index="CurItem" list="#Arguments[1]#">
        <cfset CurMax = Max( CurMax , Len(CurItem) ) />
    </cfloop>
    <cfreturn CurMax />
</cffunction>


Mais y a-t-il un meilleur moyen - quelque chose de plus efficace?

Peut-être une méthode Java? Conversion en tableau et tri par longueur d'élément? Compter le plus grand écart entre des virgules?


Concrètement, l'un ou l'autre des deux exemples ci-dessus fonctionnera sans problème pour mon besoin actuel. Il ne s'agit pas d'un problème de performances critiques. Je n'ai donc pas besoin de réponse à cette question. , mais j’ai pensé qu’il serait toujours intéressant de voir ce que les gens pourraient proposer…

Était-ce utile?

La solution

Comptez la distance entre les virgules.

Je ne pense pas que rien puisse être plus rapide que cela; c'est O (n) , et vous devez regarder chaque caractère au moins une fois de toute façon (pour voir si c'est une virgule).

int FindLongestWord(char* str)
{
   char* lastComma = str - 1;
   int longest = 0;
   int length;
   char* pCheckChar;

   for(pCheckChar = str; *pCheckChar; pCheckChar++)
   {
      if(*pCheckChar == ',')
      {
         length = pCheckChar - lastComma - 1;
         if(length > longest)
         {
            longest = length;
         }

         lastComma = pCheckChar;
      }
   }

   // Check to see if the last word is the longest
   length = pCheckChar - lastComma - 1;
   if(length > longest)
   {
      longest = length;
   }

   return longest;
}

ou je suppose que vous pourriez simplement dire

"a,set,of,random,words".Split(',').Max(w=>w.Length);

si nous jouons à des jeux ...;]

Autres conseils

En Perl (en supposant que nous ayons une variable $ max dans laquelle la réponse doit être stockée):

(length $1 > $max) && ($max = length $1) while "a,set,of,random,words" =~ /(\w+)/g;

Ou:

(length 

En Perl (en supposant que nous ayons une variable $ max dans laquelle la réponse doit être stockée):

(length $1 > $max) && ($max = length $1) while "a,set,of,random,words" =~ /(\w+)/g;

Ou:

$max = length((sort { length $b <=> length $a } split /,/, "a,set,of,random,words")[0]);

Ou:

use List::Util 'reduce';
$max = length reduce { length $a > length $b ? $a : $b } split /,/, "a,set,of,random,words";

TMTOWTDI, après tout.

EDIT: J'ai oublié les modules de base!

use List::Util 'max';
$max = max map length, split /,/, "a,set,of,random,words";

... qui réussit en quelque sorte à être plus long que les autres. Oh bien!

EDIT 2: Je viens de me souvenir de map () :

($max) = sort { $b <=> $a } map length, split /,/, "a,set,of,random,words";

Cela ressemble plus à ce que je recherche.

EDIT 3: Et juste pour être complet:

<*> > $max) && ($max = length

En Perl (en supposant que nous ayons une variable $ max dans laquelle la réponse doit être stockée):

(length $1 > $max) && ($max = length $1) while "a,set,of,random,words" =~ /(\w+)/g;

Ou:

<*>

Ou:

<*>

TMTOWTDI, après tout.

EDIT: J'ai oublié les modules de base!

<*>

... qui réussit en quelque sorte à être plus long que les autres. Oh bien!

EDIT 2: Je viens de me souvenir de map () :

<*>

Cela ressemble plus à ce que je recherche.

EDIT 3: Et juste pour être complet:

<*>) foreach split /,/, "a,set,of,random,words";

Ou:

<*>

TMTOWTDI, après tout.

EDIT: J'ai oublié les modules de base!

<*>

... qui réussit en quelque sorte à être plus long que les autres. Oh bien!

EDIT 2: Je viens de me souvenir de map () :

<*>

Cela ressemble plus à ce que je recherche.

EDIT 3: Et juste pour être complet:

<*>

Considérant qu'il existe une balise code-golf , voici 52 caractères en C #

"a,set,of,random,words".Split(',').Max(w=>w.Length);

Et voici le "court" chemin CFML - 72 caractères ...

Len(ArrayMax("a,set,of,random,words".replaceAll('[^,]','1').split(',')))

Une autre version, 78 caractères mais gère des chaînes énormes (voir les commentaires) ...

Len(ListLast(ListSort("a,set,of,random,words".replaceAll('[^,]','1'),'text')))

J'ai vu la balise golf du code - voici 54 caractères en Python:

len(max("a,set,of,random,words".split(","), key=len))

En java sans chaîne, fonctions supplémentaires. (juste une liste pseudo-liée: P) Donnez max comme 0 au début

   int find(LinkedList strings, int max) {
      int i;
      String s=(String)strings.element();
      for(i=0;s.charAt(i)!='\0';i++);
      if(strings.hasNext())
         return find(strings.Next(),(i>max?i:max));
      return max;
    }

Edit: Je viens de remarquer que nous avons maintenant une chaîne de mots et non une liste de chaînes, eh bien tant pis, restons les mêmes:)

Si vous n'êtes pas inquiet pour la lisibilité ...;)

String longest(String...ss){String _="";for(String s:ss)if(_.length()<s.length())_=s;return _;}

Je suppose que cela dépend de l'efficacité. si cela signifie le moins de caractères dans le code écrit, c'est une chose. si cela signifie moins de mémoire ou plus rapide à exécuter, c’est un autre exemple.

pour l'exécution la plus rapide, je vais prendre la boucle.

dans vc ++

int findMaxLen(const char *s)
{
    const char c = ',';
    int a = 0, b = 0;
    while(*s)
    {
        while(*s && *s++ != c)b++;
        if(b > a)a=b;
        b = 0;
    }
    return a;
}

Dans J

Assumer la liste des chaînes encadrées (L):

{.\:~>#&.>L

Un exemple utilisant un fichier CSV:

{.\:~;>#&.>readcsv'test.csv'

En scala (55 caractères):

",set,of,random,words".split(",").:\(0)(_.length max _)

Clojure: 49 octets.

(def l #(reduce max(for[x(.split%%2)](count x))))

Version lisible:

(defn longest [astr sep]
  (reduce max
    (for [word (.split astr sep)]
      (count word))))

J'apprends toujours la langue, j'aimerais donc connaître les moyens de l'améliorer.

Je n'ai pas Python devant moi, donc je ne peux pas vérifier si ça marche, mais ...

def maxlen(x):
    return len(sorted(x.split(), key=lambda y: len(y))[1])

Devrait faire l'affaire.

Cela ne serait-il pas le plus simple?

<cffunction name="findMaxLen" returntype="Numeric">
    <cfset longest = 0>
    <cfloop list="#Arguments[1]#" index="w">
        <cfif len(w) gt longest>
            <cfset longest = len(w)>
        </cfif>
    </cfloop>
    <cfreturn longest>
</cffunction>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top