鉴于各种长度单词的列表,找到任何单词的最大长度的最佳方法是什么?
例如,以下内容应返回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方法?转换为数组并按项目长度排序?计算逗号之间的最大差距?
实际上,上述两个示例中的任何一个都可以满足我当前的需求,而且这不适用于性能至关重要的事情,所以我不需要这个答案,但我认为看看人们会想出什么仍然会很有趣......
答案 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#
"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)
答案 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>