2016-10-24 4 views
0

N個の整数の配列が順列(1からNまでの各要素を含むシーケンス)かどうかを調べるroutineを解析しています。

私はPythonの初心者です。私はこのルーチンが正解をどのように得るのか把握できません。ループの背後にある論理について誰も説明できますか?とりわけcounter[element-1]の使用。

カウンタは組み込み関数がAのすべての要素で機能していますか?ループが配列上に定義されているため、counter[element-1]はAの要素の位置/値を参照するのがデフォルトですか?
Python - N個の整数からなる配列が順列であるかどうかをチェック

A=[4,1,3,2] 

    def solution(A): 
     counter = [0]*len(A) 
     limit = len(A) 
     for element in A: 
      if not 1 <= element <= limit: 
       return 0 
      else: 
       if counter[element-1] != 0: 
        return 0 
       else: 
        counter[element-1] = 1 

     return 1 

更新: 私は、例えば

def solution(A): 
    counter = [0]*len(A) 
    limit = len(A) 
    for element in A: 
     if not 1 <= element <= limit: 
      print element 
      print 'outside' 
      return 0 
     else: 
      if counter[element-1] != 0: 
       print 'element %d' % element 
       print [element-1] 
       print counter[element-1] 
       return 0 
      else: 
       counter[element-1] = 1 
       print 'element %d' % element 
       print [element-1] 
       print counter[element-1] 

    return 1 

が、私はまだない私に

element 4 
[3] 
1 
element 1 
[0] 
1 
element 3 
[2] 
1 
element 2 
[1] 
1 
1 

を与え、ループ内で使用される値を参照するためにコードを修正論理を得る。たとえば、最初の要素に注目すると、[3]が1を返すのはなぜですか?

+0

デバッガでコードをステップ実行してみてください。 –

+0

Btw入力に非整数がある場合、関数はチョークします。 –

+0

エラー証明ソリューションでJavaと全く同じではありませんが、カウンタは0で初期化された 'N'要素のリストです。配列「A」の要素を反復するとき、インデックス付けはゼロに基づくので、例えば、要素 '5'の場合は、unset(= 0)なら 'counter [5-1]'をチェックします。 – fips

答えて

1

コードの背後にあるアイデアは2倍です。リスト[1、2、...、N]の置換は2つの特性を有する。それは1とNの間の要素のみを持ち、各要素はリストに1回だけ現れます。 私は、このアイデアをコードの中で部分的に説明しようとします。

def solution(A): 
    counter = [0]*len(A) 
    limit = len(A) 

リスト[1、3、2]を例として考えてください。 counterをリスト

for element in A: 
     if not 1 <= element <= limit: 
      return 0 

この部分条件は最も簡単なものであるの要素の1つにサイズLEN(A)= 3それぞれ0対応の零点のリストとして初期化されます。要素がこの範囲にない場合、リストは[1、2、... N]の順列になることはできません。例えば、[1,3,2]は[1,2,3]の順列ですが、[1,6,2]はそうではありません。

else: 
      if counter[element-1] != 0: 
       return 0 
      else: 
       counter[element-1] = 1 

この次の部分は、各用語の一意性に関連しています。ifは、number =要素がすでにこのループを通過しているかどうかを確認します。 2番目のelseはこの番号にマークが付いているので、次の繰り返しで繰り返し番号が見つかった場合はifが真となり、0が返されます。
たとえば、リスト[1,2,2]の場合。最初の2はifをトリガーしませんが、2番目の2はトリガーして0を返します。一方、[1,3,2]はifをトリガーしません。 すべての数値がこの条件を満たす場合、2つのプロパティは真であり、リストは順列です。

+0

優れた説明!私の "新しいサイト"の低い評判のポイントのために、私はまだポイントを与えることができないことを申し訳ありません。 – Chris

+0

私も新しい笑いですが、私は本当にポイントが好きですが、心配しないでください。何かを学んで帰ってきて、それを使ってコミュニティを助けてください:)。 – Arthur

2

実際にはかなりの狡猾なアルゴリズムです。

入力は、長さがNのシーケンスです。

入力の各要素は整数であるとみなされます(そうでない場合は、比較または索引付けによって例外がスローされます)。

counterは、長さがNのフラグ配列です。

  • [1,N]範囲外のいかなる整数が
  • ませ重複が許可されない許可されていません(どのように行うのを参照)

あなたは今、両方の条件が真滞在するための唯一の方法は、のためのものであることを証明することができますシーケンスは置換となるでしょうか?

関連する問題