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メソッドですか?配列に変換してアイテムの長さで並べ替えますか? コンマ間の最大のギャップを数えますか?


実際には、上記の 2 つの例のどちらも私の現在のニーズには問題なく機能します。これはパフォーマンスが重要な場合ではないため、これに対する回答は必要ありませんが、それでも興味深いと思いました。人々が何を思いつくか見てみましょう...

4

14 に答える 14

11

コンマ間の距離を数えます。

それよりも速いものないと思います。とにかく、各文字を少なくとも1回は見る必要があります(コンマかどうかを確認するため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

$maxPerl の場合 (答えを格納する変数があると仮定します):

(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

そして、これが「短い」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 に答える
1

タグがあるように見えますがcode-golf、ここに C# の 52 文字があります

"a,set,of,random,words".Split(',').Max(w=>w.Length);
于 2009-03-02T20:47:13.657 に答える
0

私はそれが効率的な意味に依存すると思います。書かれたコードの文字数が最も少ないことを意味する場合、それは1つのことです。それが意味する場合、最小量のメモリまたは最速の実行、それは別です。

最速で実行するために、私はループを取ります。

于 2009-03-03T00:12:41.573 に答える
0

読みやすさを気にしなければ... ;)

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

目の前にPythonがないので、これが機能することを確認できませんが...

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

トリックを行う必要があります。

于 2016-07-04T22:31:29.043 に答える
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;
    }

編集:文字列のリストではなく、単語の文字列が指定されていることに気付きました。ここに同じままであることは気にしないでください:)

于 2009-03-02T21:12:25.203 に答える
0

J

ボックス化された文字列 (L) のリストを仮定します。

{.\:~>#&.>L

CSV ファイルを使用した例:

{.\:~;>#&.>readcsv'test.csv'
于 2009-05-11T16:52:20.167 に答える
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

scala の場合 (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 に答える