2016-07-21 5 views
1

私はHackerRankのいくつかの問題を解決するために作業しています。私はすでにPythonで同じ解決策を実装しようと考えていました。私のコードは私の以前のPythonソリューションをほぼ正確に反映していますが、if input_str[i-1] == input_str[i]行には範囲外の例外があります。この不一致を引き起こす可能性のあるPythonループでは、異なる動作がありますか?テストケースは、両方で同じです。Python対Javaループ

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)は1回計算され、ifブロックのinput_strを変更した後、正しい長さが反映されません。

同様に、i = 0を割り当てることは、あなたが望むように機能しません。 iは、試みた値のリセットを無視して、xrangeの次の値を引き継ぎます。

+0

は、ループのためのJavaの動作を模倣するPythonの代替はありますか?私はループバインドを動的に変更することができる何か? –

+0

ループのように見えるものが必要な場合は、本当に唯一のことは、Pythonの 'while'ループです。問題を解決する他の方法は、代わりに再帰を使うか、アルゴリズムを変更して静的なforループしか必要ないようにすることです。 – Gamrix

1

私はあなたがそうすることによって多くの時間とシステムリソースを無駄にしていると信じています。より良い解決策は、アルゴリズムをただ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)