ما هي الطريقة الأكثر فعالية للعثور على طول أطول عنصر في القائمة؟

StackOverflow https://stackoverflow.com/questions/603877

سؤال

وبالنظر إلى قائمة من الكلمات طول متنوعة، ما هو أفضل وسيلة للعثور على الحد الأقصى لطول أي كلمات؟

وعلى سبيل المثال، يجب أن تعود يلي 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>

و

ولكن هناك طريقة أفضل - شيء أكثر كفاءة

ولعل بعض الطرق جافا؟ تحويل إلى مجموعة والفرز طول السلعة؟ عد أكبر فجوة بين الفواصل؟

و

في الناحية العملية، إما من اثنين من الأمثلة المذكورة أعلاه سوف تعمل بشكل جيد لحاجتي الحالية، وهذا ليس ما هو الأداء النقدي، لذلك أنا لا <م> الحاجة إجابة على هذا ، ولكن أعتقد أنه سيكون من المثير للاهتمام لا يزال لمعرفة ما الناس قد يأتي مع ...

هل كانت مفيدة؟

المحلول

وعدد المسافة بين الفواصل.

وأنا لا أعتقد أن أي شيء <م> قد يكون أسرع من ذلك. انها 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);

وإذا كنا نلعب مباريات ...؛]

نصائح أخرى

في بيرل (على افتراض لدينا $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";

وكما نرى هناك علامة code-golf، وهنا 52 حرفا في C #

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

وأرى رمز العلامة جولف - هنا هو 54 حرفا في بيثون:

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

في جافا من دون وظائف اضافية السلسلة. (مجرد الزائفة قائمة مرتبطة: 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;
    }

وتحرير: لاحظت فقط الآن هو يعطى سلسلة من الكلمات ليست قائمة من الجمل، وكذلك أبدا العقل يبقى هنا هو نفسه:)

إذا كنت لا تشعر بالقلق حول القراءة ...؛)

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'

في سكالا (55 حرف):

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

وكلوجر: 49 بايت

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

ونسخة سهلة القراءة:

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

ما زلت تعلم اللغة، لذلك أحب أن أسمع أي وسائل لتحسينه.

وليس لدي بيثون أمامي لذلك لا يمكن أن تحقق هذا يعمل، ولكن ...

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