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

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

结果

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

有帮助吗?

解决方案

计算逗号之间的距离。

我认为 可能比这更快;它是 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);

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

其他提示

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

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

或者:

(length 

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

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

或者:

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

或者:

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

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

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

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

编辑2:我记得 map()

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

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

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

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

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

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

或者:

<*>

或者:

<*> 毕竟,TMTOWTDI。

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

<*>

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

编辑2:我记得 map()

<*>

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

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

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

或者:

<*> 毕竟,TMTOWTDI。

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

<*>

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

编辑2:我记得 map()

<*>

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

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

<*>

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

J

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

{.\:~>#&.>L

使用CSV文件的示例:

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

scala(55个字符):

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

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

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

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

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

应该做的伎俩。

这不是最简单的吗?

<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>
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top