Python
 Computer >> コンピューター >  >> プログラミング >> Python

循環循環リストにフォワードパスがあるか、Pythonにないかをチェックするプログラム


numsという循環リストがあるとします。したがって、最初と最後の要素はネイバーです。したがって、任意のインデックス(i)から開始して、nums [i]が正の値の場合は、nums [i]のステップ数を前方に移動できます。それ以外の場合は、負の値の場合は後方に移動できます。パスが前方にのみ進むか、後方にのみ進むように、長さが1より大きいサイクルがあるかどうかを確認する必要があります。

したがって、入力がnums =[-1、2、-1、1、2]のようである場合、順方向パス[1-> 3-> 4-> 1]

これを解決するには、次の手順に従います-

  • n:=numsのサイズ
  • nが0と同じ場合、
    • Falseを返す
  • saw:=サイズnの配列で、0で埋める
  • numsの各要素xに対してxmodnを取得してnumsを更新します
  • iter:=0
  • 0からn-1の範囲のiの場合、do
    • nums [i]が0と同じ場合、
      • 次の反復に進む
    • iter:=iter + 1
    • pos:=True
    • neg:=True
    • curr:=i
    • 次のことを繰り返し実行します。
      • nums[curr]とseen[curr]がiterと同じ場合、
        • Trueを返す
      • sawed [curr]がゼロ以外の場合、
        • ループから抜け出す
      • nums [curr]> 0の場合、
        • neg:=False
      • それ以外の場合、
        • pos:=False
      • negとposの両方がfalseの場合、
        • ループから抜け出す
      • sawed [curr]:=iter
      • curr:=(curr + nums [curr] + n)mod n
      • nums [curr]が0と同じ場合、
        • ループから抜け出す
  • Falseを返す

理解を深めるために、次の実装を見てみましょう-

def solve(nums):
   n = len(nums)
   if n == 0:
      return False
   seen = [0]*n
   nums = [x % n for x in nums]
   iter = 0
   for i in range(n):
      if nums[i] == 0:
         continue
      iter += 1
      pos = True
      neg = True
      curr = i
      while True:
         if nums[curr] and seen[curr] == iter:
            return True
         if seen[curr] :
            break
         if nums[curr] > 0:
            neg = False
         else:
            pos = False
         if not neg and not pos:
            break
         seen[curr] = iter
         curr = (curr + nums[curr] + n) % n
         if nums[curr] == 0:
            break
   return False

nums = [-1, 2, -1, 1, 2]
print(solve(nums))

入力

[-1, 2, -1, 1, 2]

出力

True

  1. グラフに共通の到達可能なノードがあるかどうかをPythonでチェックするプログラム

    有向グラフのエッジリストがあり、ノードがn個あり、ノード名が0〜n-1であるとします。2つの整数値aとbもあります。 cからaに、またcからbに移動できるようなノードcがあるかどうかを確認する必要があります。 したがって、入力が次のような場合 また、a =2、b =3の場合、出力はTrueになります。これは、ここではc =0であるため、0から2、さらには0から3へのルートがあります。 これを解決するには、次の手順に従います- 関数DFS()を定義します。これは、グラフ、ノード、訪問済みを取得します ノードにアクセスしていない場合は、 ノードを訪問済みとしてマーク グラフ[ノード]

  2. Pythonでヒープが最大ヒープを形成しているかどうかを確認するプログラム

    ヒープツリーを表すリストがあるとします。私たちが知っているように、ヒープは完全な二分木です。要素が最大ヒープを形成しているかどうかを確認する必要があります。最大ヒープについて知っているように、すべての要素はその子の両方よりも大きくなります。 したがって、入力がnums =[8、6、4、2、0、3]のような場合、すべての要素が子よりも大きいため、出力はTrueになります。 これを解決するには、次の手順に従います- n:=numsのサイズ 0からn-1の範囲のiの場合、do m:=i * 2 num:=nums [i] m + 1