3

给定一个不同长度的单词列表,找到任何单词的最大长度的最佳方法是什么?

例如,以下应返回 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方法?转换为数组并按项目长度排序?计算逗号之间的最大间隔?


实际上,以上两个示例中的任何一个都可以很好地满足我当前的需求,并且这不适用于对性能至关重要的东西,因此我不需要对此答案,但是我认为仍然会很有趣看看人们会想出什么...

4

14 回答 14

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

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

于 2009-03-02T20:33:23.863 回答
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";
于 2009-03-02T22:00:15.103 回答
1

看到有code-golf标签,这里是 C# 中的 52 个字符

"a,set,of,random,words".Split(',').Max(w=>w.Length);
于 2009-03-02T20:47:13.657 回答
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')))
于 2009-03-02T21:06:06.530 回答
0

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

len(max("a,set,of,random,words".split(","), key=len))
于 2009-03-02T20:44:05.630 回答
0

在没有字符串额外功能的java中。(只是一个伪链表:P)在开始时将最大值设为 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;
    }

编辑:现在刚刚注意到它给出的是一个字符串而不是字符串列表,没关系在这里保持不变:)

于 2009-03-02T21:12:25.203 回答
0

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

String longest(String...ss){String _="";for(String s:ss)if(_.length()<s.length())_=s;return _;}
于 2009-03-02T22:24:48.367 回答
0

我想这取决于高效的含义。如果这意味着编写的代码中的字符最少,那是一回事。如果这意味着最少的内存或最快的执行速度,那就是另一个。

为了最快的执行,我将采取循环。

于 2009-03-03T00:12:41.573 回答
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;
}
于 2009-05-11T15:12:20.360 回答
0

J

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

{.\:~>#&.>L

使用 CSV 文件的示例:

{.\:~;>#&.>readcsv'test.csv'
于 2009-05-11T16:52:20.167 回答
0

在斯卡拉(55个字符):

",set,of,random,words".split(",").:\(0)(_.length max _)
于 2009-06-11T04:42:16.420 回答
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))))

我还在学习这门语言,所以我很想听听任何改进它的方法。

于 2009-09-25T04:35:01.637 回答
0

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

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

应该做的伎俩。

于 2016-07-04T22:31:29.043 回答
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>
于 2016-07-08T18:57:25.587 回答