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

PythonでGCDを大きくするための配列からの最小限の削除


N個の番号のリストがあるとします。残りの数のGCDがN個の最初のGCDよりも大きくなるように、必要な数の削除の最小数を見つける必要があります。

したがって、入力が[6,9,15,30]の場合、最初のgcdは3であるため、出力は2になります。したがって、6と9を削除すると、gcdは15、15>3になります。

>

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

  • INF:=100001
  • spf:=要素0からINFまでのリスト
  • 関数sieve()を定義します
  • 範囲4からINFのiの場合、2ずつ増やします。
    • spf [i]:=2
  • 範囲3からINFのiの場合は、
    • if i ^ 2> INF −
      • 休憩
    • spf [i]がiと同じ場合、
      • 範囲2*iからINFのjの場合、各ステップでiずつ更新します。
        • spf [j]がjと同じ場合、
          • spf [j]:=i
  • 関数calc_fact()を定義します。これにはxがかかります
  • ret:=新しいリスト
  • xは1と同じではありませんが、
    • retの最後にspf[x]を挿入します
    • x:=x / spf [x](整数部分のみを取得)
  • return ret
  • メインメソッドから次の手順を実行します-
  • g:=0
  • 0からnの範囲のiについては、
    • g:=gcd(a [i]、g)
  • my_map:=新しい地図
  • 0からnの範囲のiについては、
    • a [i]:=a [i] / g(整数部分のみを取得)
  • 0からnの範囲のiについては、
    • p:=calc_fact(a [i])
    • s:=新しい地図
    • 0からpのサイズの範囲のjについては、
      • s [p [j]]:=1
    • sの各iについて、
      • my_map [i]:=my_map + 1のget(i、0)
  • 最小=10^ 9
  • my_mapの各iについて、
    • 最初:=i
    • 秒:=my_map [i]
    • if(n-second)<=minimum、then
      • 最小:=n-2番目
  • 最小値が10^9でない場合、
    • 最小返品
  • それ以外の場合、
    • 戻り値-1

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

from math import gcd as __gcd
INF = 100001
spf = [i for i in range(INF)]
def sieve():
   for i in range(4, INF, 2):
      spf[i] = 2
   for i in range(3, INF):
      if i**2 > INF:
         break
      if (spf[i] == i):
         for j in range(2 * i, INF, i):
            if (spf[j] == j):
               spf[j] = i
def calc_fact(x):
   ret = []
   while (x != 1):
      ret.append(spf[x])
      x = x // spf[x]
   return ret
def minRemove(a, n):
   g = 0
   for i in range(n):
      g = __gcd(a[i], g)
   my_map = dict()
   for i in range(n):
      a[i] = a[i] // g
   for i in range(n):
      p = calc_fact(a[i])
      s = dict()
      for j in range(len(p)):
         s[p[j]] = 1
      for i in s:
         my_map[i] = my_map.get(i, 0) + 1
   minimum = 10**9
   for i in my_map:
      first = i
      second = my_map[i]
      if ((n - second) <= minimum):
         minimum = n - second
   if (minimum != 10**9):
      return minimum
   else:
      return -1
a = [6, 9, 15, 30]
n = len(a)
sieve()
print(minRemove(a, n))
を返す

入力

[6, 9, 15, 30], 4

出力

2

  1. Pythonの部分文字列から回文を作成できます

    文字列sがあるとすると、sの部分文字列に対してクエリを実行する必要があります。クエリクエリ[i]ごとに、3つの部分[左、右、k]があり、部分文字列s [左]、...、s [右]を再配置して、それらのうち最大k個を選択して置換することができます。小文字の英字。上記の操作の後でサブストリングが回文である可能性がある場合、クエリの結果はtrueです。それ以外の場合はfalse。配列answer[]を見つける必要があります。ここで、answer[i]はi番目のクエリクエリ[i]の結果です。 たとえば、入力が「abcda」の場合、クエリは[[3,3,0]、[1,2,0]、[0,3,1]、[0,3,2]

  2. Pythonで並べ替えられた配列から重複を削除する

    ソートされたリストAがあるとします。重複するすべてのエントリを削除した後、配列の長さを返す必要があります。これは、O(1)の余分なスペースで実行する必要があります。そのため、その場で操作を行う必要があります。 たとえば、A =[1、1、2、2、2、3、3、3、3、4、5、5、5、6]とすると、6つの異なる要素があるため、出力は6になります。 これを解決するには、次の手順に従います- リストが空の場合は、0を返します それ以外の場合は、最初にprev=Aの最初の要素を取得します。長さ=0を定義します for i:=1からn-1、do A [i]がprevと同じでない場合、 長さ:=