Pregunta

Dada una lista de palabras de longitud variada, ¿cuál es la mejor manera de encontrar la longitud máxima de cualquier palabra?

Por ejemplo, lo siguiente debería devolver 6

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


Por supuesto, es bastante trivial hacer esto ...

<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>


O, un poco más corto ...

<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>


¿Pero hay una mejor manera, algo más eficiente?

¿Quizás algún método Java? ¿Convertir a matriz y ordenar por longitud del artículo? ¿Contando la mayor brecha entre comas?


En términos prácticos, cualquiera de los dos ejemplos anteriores funcionará bien para mi necesidad actual, y esto no es para algo que es crítico para el rendimiento, por lo que no necesito una respuesta a esto , pero pensé que aún sería interesante ver lo que la gente podría pensar ...

¿Fue útil?

Solución

Cuente la distancia entre comas.

No creo que nada pueda ser más rápido que eso; es O (n) , y usted tiene para mirar cada personaje al menos una vez de todos modos (para ver si es una coma).

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;
}

o supongo que podrías decir

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

si estamos jugando juegos ...;]

Otros consejos

En Perl (suponiendo que tengamos una variable $ max en la que se almacenará la respuesta):

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

O:

(length 

En Perl (suponiendo que tengamos una variable $ max en la que se almacenará la respuesta):

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

O:

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

O:

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

TMTOWTDI, después de todo.

EDITAR: ¡Olvidé los módulos principales!

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

... que de alguna manera logra ser más largo que los otros. Oh bien!

EDIT 2: acabo de recordar map () :

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

Eso es más parecido a lo que estoy buscando.

EDITAR 3: Y solo para completar:

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

En Perl (suponiendo que tengamos una variable $ max en la que se almacenará la respuesta):

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

O:

<*>

O:

<*>

TMTOWTDI, después de todo.

EDITAR: ¡Olvidé los módulos principales!

<*>

... que de alguna manera logra ser más largo que los otros. Oh bien!

EDIT 2: acabo de recordar map () :

<*>

Eso es más parecido a lo que estoy buscando.

EDITAR 3: Y solo para completar:

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

O:

<*>

TMTOWTDI, después de todo.

EDITAR: ¡Olvidé los módulos principales!

<*>

... que de alguna manera logra ser más largo que los otros. Oh bien!

EDIT 2: acabo de recordar map () :

<*>

Eso es más parecido a lo que estoy buscando.

EDITAR 3: Y solo para completar:

<*>

Al ver que hay una etiqueta code-golf , aquí hay 52 caracteres en C #

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

Y aquí está la forma 'corta' de CFML: 72 caracteres ...

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

Otra versión, 78 caracteres pero maneja cadenas enormes (ver comentarios) ...

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

Vi la etiqueta de golf de código: aquí hay 54 caracteres en Python:

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

En java sin funciones adicionales de cadena. (solo una lista pseudoenlace: P) Proporcione max como 0 en el comienzo

   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;
    }

Editar: Acabo de notar que ahora se le da una Cadena de palabras, no una lista de cadenas, bueno, no importa quedarse aquí igual :)

Si no le preocupa la legibilidad ...;)

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

supongo que depende de lo que significa eficiente. si significa la menor cantidad de caracteres en el código escrito, eso es una cosa. si eso significa, la menor cantidad de memoria o la ejecución más rápida, esa es otra.

para una ejecución más rápida, tomaré el ciclo.

en 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;
}

En J

Suponga la lista de cadenas en caja (L):

{.\:~>#&.>L

Un ejemplo usando un archivo CSV:

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

En scala (55 caracteres):

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

Clojure: 49 bytes.

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

Versión legible:

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

Todavía estoy aprendiendo el idioma, así que me encantaría escuchar cualquier forma de mejorarlo.

No tengo Python delante de mí, así que no puedo verificar que esto funcione, pero ...

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

Debería hacer el truco.

¿No sería esto más 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>
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top