2013-05-17 7 views
-1

im은 python에 처음 익숙해지며, 지금까지 잘하고 있습니다. 그러나이 문제는 나를 죽이고 있습니다.문자열의 역전을 계산합니다.

는 문제점 :

시퀀스의 반전은 고장의 항목이 한 쌍이다. 예를 들어, F는 문자열의 앞부분에 나타나지만 나중에 알파벳에 나타나기 때문에 F와 D 문자는 'ABBFHDL'문자열에서 반전을 형성합니다. 문자 H와 D는 또한 반전을 형성합니다. 시퀀스의 총 역전 수, 즉 순서가 잘못된 쌍의 수는 시퀀스가 ​​정렬되지 않은 방법의 척도이다. 'ABBFHDL'에있는 역전의 총 수는 2입니다. 대문자 A ~ Z의 시퀀스 (문자열)를 취하여 시퀀스의 역변환 횟수를 반환하는 함수 inversions()를 구현하십시오.

내가 지금까지 가지고 것은 다음

def inversions(s): 
     count = 0 
     for i in range(len(s)):   # for each index i 
      for j in range(len(s)):  # for each index J 
       if s[j]>=s[i]:   # compare string[i] and string[j] 
        count += 0 

       else: 
        count +=1 
        return count 

등이 정확하지 충분히 멀리 RABIT 구멍 좋은 부분 크레딧 :(

이 나에게 일을 제공을 얻으려면 아래 아닙니다의를 . 궁금 무엇 메신저

(2이어야한다)이이 달성하기 위해 코드를 작성하는 방법입니다, 지금 큰 장애물이다 : 큰 각 인덱스 j에 대한 #보다 내가

내가 이것들을 시도,

내가 몇 가지 코드를 시도했지만 난 일하러 해달라고 :

for j in range(len(s)>i):  # the result i get is 1 
    for j in range(len(s)<i):  # the result i get is 'blank 
    for j in range(len(s)>s[i]): # the result i get is this error message : 

    for j in range(len(s)>s[i]): 
    TypeError: unorderable types: int() > str() 

내가 뭘 달성 할 수없는 것은 순서 (문자열)의 모든 가능한 쌍을 통해 기능으로 반복을 얻는 것입니다.

(즉, AA, AB, AB, AF, AH, AD, AL, BB, BB, BF, BH, BD, BL 중 하나는 카운트를 렌더링하지 않지만 반복이 F에 도달하면 반전 2)

난 그냥 캔트 내 코드와 함께 거기 때문에 대답, HD에 대한 다음 FD에 대한 계산합니다.

답변

1

개정 코드

을이 작동합니다

def inversions(s): 
     count = 0 
     for i in range(len(s)-1): 
      for j in range(i+1,len(s)): 
       if s[i] > s[j]: 
        print(s[i],s[j]) 
        count += 1 
        break 
#remove 'break' if you want to count every possible 
#out of order pair for a particular character in the string 
     print(count) 
+0

내 나쁜,하지만 대답은 2 시퀀스 F가 D보다 먼저 나오고 H가 D가되기 때문에 - 역변환은 2이므로. 죄송합니다. 처음 쓰는 순간 너무 조금 빨랐습니다. – Snarre

+0

@ user2394720 "시퀀스의 역변환"에 대한 정의를 다시 말씀해 주시겠습니까? 위의 코드가 맞다면 항목 쌍으로 언급했습니다. . – ParokshaX

+0

ok, 순서의 역전의 총 수, 즉 순서가 잘못된 쌍의 수입니다. 이것은 인접한 쌍뿐 아니라 시퀀스에서 항목의 가능한 모든 쌍입니다. EXE : AA, AB, BB, AF, FH, HD, DL 등 이 쌍 중 하나라도 alpahbetical order가 아니면 알고리즘에 +1이 추가되어야합니다. 내 문제는 내가 할 수있는 모든 시퀀스에서 가능한 모든 쌍을 반복하는 루프를 작성하는 방법을 알아낼 수없는 것 (문자열)입니다. A로 시작하는 시퀀스의 모든 문자를 다음 문자와 비교해야한다고 생각합니다. – Snarre

1

여기에 모든 문자 쌍을 얻을 수있는 방법 :

for i in range(len(s)): 
    for j in range(i + 1, len(s)): 
     print s[i], s[j] 

내가 당신에게 계산 부분을 떠날거야!

0

이제 내가 제공하는 코드는 좋은 코드가 아니지만 여전히 교육적 일 수 있습니다.

inv = lambda w:sum([sum([w[i]>w[j] for j in range(i+1,len(w))]) for i in range(len(w))]) 

당신이 지정한 것과 정확히 일치합니까? 한 번 코드 골프 도전을 위해 이것을 썼습니다.

당신은 사용 itertools에 의해 약간 그것을 nicen 수

:

from itertools import combinations 
inv = lambda w:sum([w[i]>w[j] for i,j in combinations(range(len(w)),2)]) 
당신이 다른 기능을 사용하는 것처럼 당신이 람다 기능을 사용할 수 있습니다

:

In [32]: inv('ABBFHDL') 
Out[32]: 2 
관련 문제