[Botão Power - prática diária pequena] 914. O pacote de cartão (python)

914. O pacote de cartão

ligações Tópico: https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/
Dificuldade: Fácil

Assunto Descrição:

Dado um baralho de cartas, cada cartão são escritos em um inteiro.

Neste ponto, você precisa selecionar um número X, para que possamos ser baralhos completos de acordo com as seguintes regras em 1 组ou 更多组:

  • Cada grupo tem um Xcartão.
  • Dentro do grupo são escritos da mesma inteiro em todos os cartões.

Somente quando você opcionais X >= 2retornos true.

Exemplos

Exemplo 1:
Entrada: [1,2,3,4,4,3,2,1]
Saída: verdadeiro
interpretação: agrupamento é possível [1,1], [2,2], [3,3], [ 4,4]

Exemplo 2:
Entrada: [1,1,1,2,2,2,3,3]
Saída: falso
interpretação: o pacote não satisfaz as exigências.

Exemplo 3:
Entrada: [1]
Saída: falso
interpretação: o pacote não satisfaz as exigências.

Exemplo 4:
Entrada: [1,1]
Saída: verdadeiro
interpretação: agrupamento é possível [1,1]

Exemplo 5:
Entrada: [1,1,2,2,2,2]
Saída: verdadeiro
interpretação: agrupamento é possível [1,1], [2,2], [2,2]

pronto:

1 <= deck.length <= 10000
0 <= convés [i] <10000

idéias de solução de problemas

Esta questão eu acho que por um longo Leng Shimo feita, ou perguntas estrada simples, auto-confiança está rolando, e realmente não esperava usar 最大公约数para fazer, hey, hum

Esta questão é crucial é que podemos pensar em usar 最大公约数para calcular.

  • 1, os primeiros dados estatísticos sobre o número de cada elemento, que consiste de uma lista

    • maneira simples: num = list(collections.Counter(deck).values())um passo
  • 2, Passo 1 lista calculado maior divisor comum obtido

    • maneira simples: n = reduce(math.gcd, num)um passo
  • 3, se o divisor ou igual a 2, True é retornado, caso contrário devolve Falso

Em que o pedido nnúmero 最大公约数, ou 最小公倍数se você quiser realizado manualmente, calculada da seguinte forma:

  • 1> primeiro encontrar o máximo divisor comum e mínimo múltiplo comum do número 2
  • 2> e os resultados do terceiro número e o mínimo múltiplo comum e o máximo divisor comum continuou
  • 3> A mesma demanda tem sido, até que todos os números estão buscando novamente

O código de exemplo

# 简单方法
import collections
import math
from functools import reduce

class Solution:
    def hasGroupsSizeX(self, deck: List[int]) -> bool:
        num = list(collections.Counter(deck).values())
        n = reduce(math.gcd,num)
    	
        return False if n<2 else True

#该简单方法参考自:
##作者:jutraman
##链接:https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/solution/pythonqia-pai-fen-zu-by-jutraman/
# 复杂一点的,其实就是把上述简单方法调的函数自己手动实现而已
class Solution:
    def hasGroupsSizeX(self, deck: List[int]) -> bool:
        # 第1步:统计,结果保存在num列表中
        # 简单方法:num = list(collections.Counter(deck).values())
        only_ele = [deck[0]]
        num = {deck[0]: 1}
        for i in deck[1:]:
            if i in only_ele:
                n = num[i] + 1
                num[i] = n
            else:
                num[i] = 1
                only_ele.append(i)
        num = list(num.values())
        
        if len(num)==1:
            if num[0] > 1:
                return True
            return False
         
        # 第2步:计算最大公约数n
        # 简单方法:n = reduce(math.gcd, num)
        n = self.gcd(num[0],num[1])
        for i in range(len(num)-2):
            n = gcd(n,num[i+2])
        
        # 第3步:判断最大公约数是否大于等于2
        return True if n>1 else False

    def gcd(self,a,b):# 计算两个数的最大公约数
        if a < b:#让a保持是大的数
            temp = b
            b = a
            a = temp
        n = 1
        i = 1
        while i <= b:            
            if a % i == 0 and b % i == 0:
                n = i
            i += 1
        return n
Publicado 44 artigos originais · ganhou elogios 5 · Vistas 4463

Acho que você gosta

Origin blog.csdn.net/ljb0077/article/details/105143064
Recomendado
Clasificación