查找列表中最长项目长度的最有效方法是什么?

时间:2009-03-02 20:31:12

标签: string language-agnostic list coldfusion code-golf

鉴于各种长度单词的列表,找到任何单词的最大长度的最佳方法是什么?

例如,以下内容应返回6

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


当然,做到这一点真是微不足道......

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


或者,更短......

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


但是有更好的方法 - 效率更高吗?

也许是一些Java方法?转换为数组并按项目长度排序?计算逗号之间的最大差距?


实际上,上述两个示例中的任何一个都可以满足我当前的需求,而且这不适用于性能至关重要的事情,所以我不需要这个答案,但我认为看看人们会想出什么仍然会很有趣......

14 个答案:

答案 0 :(得分:11)

计算逗号之间的距离。

我认为 可能比这更快;它是O(n),而你至少有一次来查看每个字符(看它是否是逗号)。

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

或者我想你可以说

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

如果我们正在玩游戏......;]

答案 1 :(得分:2)

在Perl中(假设我们有一个变量$max,其中存储了答案):

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

或者:

(length $_ > $max) && ($max = length $_) foreach split /,/, "a,set,of,random,words";

或者:

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

编辑:我忘记了核心模块!

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

......它以某种方式设法比其他的更长。哦,好吧!

编辑2:我记得map()

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

那是更像我正在寻找的东西。

编辑3:只是为了完整性:

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

答案 2 :(得分:1)

看到有code-golf标签,这里是C#

中的52个字符
"a,set,of,random,words".Split(',').Max(w=>w.Length);

答案 3 :(得分:1)

这是'短'CFML方式 - 72个字符......

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

另一个版本,78个字符,但处理大字符串(见注释)......

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

答案 4 :(得分:0)

我确实看到了代码高尔夫标签 - 这里是Python中的54个字符:

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

答案 5 :(得分:0)

在java中没有字符串的额外函数。 (只是一个伪链表:P)在开头

中将max设为0
   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;
    }

编辑:现在注意到它给了一个单词串而不是字符串列表,好吧不要介意在这里保持相同:)

答案 6 :(得分:0)

如果您不担心可读性......;)

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

答案 7 :(得分:0)

我想这取决于有效的手段。如果它意味着编写的代码中字符数量最少,那就是一回事。如果它意味着最少的内存或最快的执行,那就是另一个。

为了最快的执行,我会接受循环。

答案 8 :(得分:0)

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

答案 9 :(得分:0)

J

假设盒装字符串列表(L):

{.\:~>#&.>L

使用CSV文件的示例:

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

答案 10 :(得分:0)

scala(55个字符):

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

答案 11 :(得分:0)

Clojure:49个字节。

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

易读版本:

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

我还在学习这门语言,所以我很乐意听到任何方法来改进它。

答案 12 :(得分:0)

我面前没有Python,所以我无法检查这是否有效,但是......

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

应该做的伎俩。

答案 13 :(得分:0)

这不是最简单的吗?

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