2016-07-21 4 views
1

나는 HackerRank에 관한 몇 가지 문제를 해결하려고 노력하고 있으며 파이썬에서 이미 자바로 정확하게 해결 한 동일한 솔루션을 구현하려고한다고 생각했다. 내 코드가 이전의 Python 솔루션을 거의 정확하게 반영하지만, if input_str[i-1] == input_str[i] 행에 예외가 있습니다. 이 불일치를 유발할 수있는 파이썬 루프에서 다른 동작이 있습니까? 두 경우 모두 테스트 케이스가 동일합니다.파이썬 대 자바 루프

public class Solution { 

    public static void main(String[] args) { 
     Scanner sc = new Scanner(System.in); 
     String input = sc.nextLine(); 
     solve(input); 
    } 
    public static void solve(String str) { 
     String s = new String(str); 
     for (int i=1; i < s.length(); i++) { 
      if (s.charAt(i-1) == s.charAt(i)) { 
       s = s.substring(0, i-1) + s.substring(i+1, s.length()); 
       i = 0; 
      } 
      if (s.length() == 0) { 
       System.out.println("Empty String"); 
       return; 
      } 
     } 
     System.out.println(s); 
    } 
} 

그리고 이것은 동일한 문제이지만 Python 2.7을 사용하는 코드입니다.

input_str = raw_input() 
for i in xrange(1, len(input_str)): 
    if input_str[i-1] == input_str[i]: 
     input_str = input_str[0:i-1] + input_str[i+1:len(input_str)] 
     i = 0 
    if len(input_str) == 0: 
     print "Empty String" 
     break 

print input_str 

답변

5

Java 루프에서 반복 할 때마다 s.length()이 다시 계산됩니다. Python에서 len(input_str)은 한 번만 계산되며 if 블록에서 input_str을 수정 한 후 올바른 길이를 반영하지 않습니다.

마찬가지로 i = 0을 지정하면 원하는 방식으로 작동하지 않습니다. i은 시도한 값 재설정을 무시하고 xrange의 다음 값을 취합니다.

+0

루프 자바의 동작을 모방하는 파이썬 대안이 있습니까를? 루프 바인딩을 동적으로 수정할 수있는 부분은 무엇입니까? –

+0

for 루프처럼 보이는 것을 원한다면 정말로 할 수있는 것은 파이썬'while' 루프입니다. 문제를 해결하는 다른 방법은 재귀를 사용하거나 알고리즘을 변경하여 정적 for 루프 만 필요하도록하는 것입니다. – Gamrix

1

나는 이렇게하면 많은 시간과 시스템 리소스를 낭비하고 있다고 생각합니다. 더 좋은 해결책은 알고리즘을 input_str 번만 반복하는 알고리즘으로 변경하는 것입니다. 어떤 경우에는 실행 시간이 O(n)이됩니다. 내 편집 코드는 이렇게 보입니다 :이 경우

input_str = input() 
input_strR = input_str[0] 
for i in range(1, len(input_str)): 
    if input_str[i-1] != input_str[i]: 
     input_strR = input_strR + input_str[i] 
    if len(input_str) == 0: 
     print ("Empty String") 
     break 

print (input_strR) 

새 변수를 도입 및 중복 감소하는 동안 모두 첫 번째 문자가 추가되었습니다.

0

내가 funaquarius24 구축에도 인덱스를 사용하지 것이다 :

input_str = raw_input() 
result = input_str[0] 
for c in input_str[1:]: 
    if c != result[-1]: 
     result += c 
print(result)