문제

다양한 길이 단어 목록이 주어지면 단어의 최대 길이를 찾는 가장 좋은 방법은 무엇입니까?

예를 들어, 다음은 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 $_ > $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 태그, 여기 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')))

코드 골프 태그를 보았습니다. 여기에는 파이썬에 54자가 있습니다.

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

문자열이없는 Java에서 추가 함수. (의사 연결 목록 만

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

~ 안에 제이

박스형 문자열 목록 (L)을 가정합니다.

{.\:~>#&.>L

CSV 파일을 사용하는 예 :

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

스칼라 (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))))

나는 여전히 언어를 배우고 있으므로 언어를 개선 할 수있는 방법을 듣고 싶습니다.

내 앞에 파이썬이 없어서이 작품을 확인할 수는 없지만 ...

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