Gado programação off-line rede temática "para provar a segurança OFERTA perguntas 40 da entrevista" uma vez que uma série de números que só aparecem

Meu pessoal número público micro-canal: Microstrong

Micro-channel número público ID: MicrostrongAI

Micro-channel número pública Descrição: Microstrong (Bauer) os alunos estudam principalmente a aprendizagem de máquina, aprendizagem profunda, visão computacional, o conteúdo relacionadas ao sistema diálogo inteligente, notas de estudo participação no processo de aprendizagem! Aguardamos a sua atenção, bem-vindo a troca de aprendizado progredir juntos!

Sei quase home page: https: //www.zhihu.com/people/MicrostrongAI/activities

Github: https: //github.com/Microstrong0305

blog pessoal: https: //blog.csdn.net/program_developer

 ligações Tópico:

https://www.nowcoder.com/practice/e02fdb54d7524710a7d664d082bb7811?tpId=13&tqId=11193&tPage=2&rp=2&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

Assunto Descrição:

 ideias de resolução de problemas:

(1) a complexidade espacial para complexidade vez

complexidade de espaço O (n)e complexidade de tempo O (n).

AC tem o código:

# -*- coding:utf-8 -*-
class Solution:
    # 返回[a,b] 其中ab是出现一次的两个数字
    def FindNumsAppearOnce(self, array):
        # write code here
        num_dic = {}
        result_list = []
        for item in array:
            if item in num_dic.keys():
                num_dic[item] = num_dic[item] + 1
            else:
                num_dic[item] = 1

        for item, count in num_dic.items():
            if count == 1:
                result_list.append(item)

        return result_list


if __name__ == "__main__":
    input_array = [2, 4, 3, 6, 3, 2, 5, 5]
    sol = Solution()
    print(sol.FindNumsAppearOnce(input_array))

(2) utilizando a função Python list.count (), a complexidade de tempo éO (n)

# -*- coding:utf-8 -*-
class Solution:
    # 返回[a,b] 其中ab是出现一次的两个数字
    def FindNumsAppearOnce(self, array):
        # write code here
        result_list = []
        for item in array:
            count = array.count(item)
            if count == 1:
                result_list.append(item)

        return result_list

(3) usando XOR pensou, complexidade de tempo O (n), a complexidade do espaçoO(1)

conceito XOR: Se a, b dois valores são diferentes, o resultado é um OR exclusivo. Se, de valores b são os mesmos, o exclusivo OR resultado é 0.

        Este é um problema mais difícil, muito poucas pessoas podem não precisa ser solicitado uma vez que a melhor solução no momento da entrevista. Geralmente, quando os candidatos não tenha pensado a idéia depois de alguns minutos, o entrevistador vai dar algumas dicas. O entrevistador poderia ter dito: Você pode considerar essa matriz tem apenas aparece um número apenas uma vez, outros surgiram duas vezes, como encontrar esse número?

        Ambos os temas estão enfatizando um (ou dois> números aparecem apenas uma vez, outros aparecem duas vezes o que é que nós pensamos de uma operação de natureza XOR :? Qualquer um de uma série de seu próprio exclusivo ou são iguais a zero. isto é, se nos voltarmos do início ao conjunto acabamento XOR cada número, em seguida, o resultado final é exatamente o número aparece apenas uma vez, porque esses números vêm em pares de dois em todos diferente ou offset.

        Após quer entender como resolver este problema simples, vamos voltar à pergunta inicial, veja se você pode aplicar as mesmas idéias. Tentámos a matriz original é dividido em dois sub-matrizes de modo que cada sub-matriz contém um número aparece apenas uma vez, enquanto outras figuras aparecem duas vezes em pares. Se isso pode ser dividida em duas matrizes, respectivamente, podemos encontrar dois números só aparecem uma vez em conformidade com a abordagem anterior.

         resultado XOR de um número de nós do início ao fim ou transformar XOR variedade cada número, de modo que o resultado final é obtido apenas dois aparecem. Porque as outras figuras surgiram duas vezes, todos em exclusivo ou offset. Devido a estas duas figuras não é certamente o mesmo, então o resultado XOR não zero é certamente, o que significa que o número resultante de representação binária não é, pelo menos, 12:59. Encontramos a posição de bit primeiro 1 no número resultante, referido como o n-th posição. Agora que não são o n-ésimo bit é um 1 é uma matriz original digital padrão é dividido em dois sub-sies, o primeiro sub-conjunto de n bits cada número é um, o segundo sub-conjunto de cada dígito n bits são 0. Porque os nossos padrões são agrupados em um bit digital é um 1 ou um 0, então o surgimento de duas digitais certamente são atribuídos à mesma sub-array. Porque o mesmo número em qualquer um dos dois são os mesmos, que não é possível colocar dois números idênticos atribuídos a dois sub-sies de ir, de modo que tem a matriz original é dividido em dois sub-sies, cada sub-matriz contém um números aparecem apenas uma vez, enquanto outras figuras surgiram duas vezes. Nós já sabemos como encontrar o único em uma matriz de números aparecer apenas uma vez, até agora todos os problemas foram resolvidos.

        Por exemplo, assumindo que a matriz de entrada {2, 4, 3, 6, 3, 2, 5, 5}. Quando nos voltamos para cada número na operação variedade XOR, e o resultado é expresso em binário é 0010. XOR resultado obtido no bit penúltimo é 1, de modo que não são a segunda matriz 1 é dividido em dois de acordo com o inverso de um número. A primeira sub-matriz {2, 3, 6, 3, 2} no penúltimo lugar todos os números são 1, e o segundo sub-conjunto {4, 5, 5} na segunda mais baixa de todos os números são 0. Então, desde que estas duas sub-matrizes são divergentes ou, você pode encontrar a primeira criança só aparece uma vez na matriz de números é 6, e a segunda sub-array ocorre apenas uma vez número é 4.

        I pensar claramente após todo o processo não é difícil escrever o código. Aqui está o código tem AC:

# -*- coding:utf-8 -*-
class Solution:

    def FindNumsAppearOnce(self, array):
        # write code here
        if array == None or len(array) < 2:
            return []

        # 对数据进行异或运算
        resultExclusiveOR = 0
        for i in array:
            resultExclusiveOR ^= i

        # 在异或结果中找出从右向左第一个为1的索引
        indexOf1 = self.FindFirstBitIs1(resultExclusiveOR)

        num1 = 0
        num2 = 0
        for j in array:
            if self.IsBit1(j, indexOf1):
                num1 ^= j
            else:
                num2 ^= j

        return [num1, num2]

    def FindFirstBitIs1(self, num):
        indexBit = 0
        while num & 1 == 0:
            num = num >> 1
            indexBit += 1
        return indexBit

    def IsBit1(self, num, indexBit):
        num = num >> indexBit
        return (num & 1)


if __name__ == "__main__":
    input_array = [2, 4, 3, 6, 3, 2, 5, 5]
    sol = Solution()
    print(sol.FindNumsAppearOnce(input_array))

Referência:

[1] ganha a oferta, o Haitao.

[2] para provar a segurança OFERTA matriz aparece apenas uma vez na versão digital endereço -java: https://www.bilibili.com/video/av88622216?from=search&seid=17735582839041767037     

Publicado 289 artigos originais · Louvor obteve 1.000 · Visualizações 1,2 milhões +

Acho que você gosta

Origin blog.csdn.net/program_developer/article/details/104575579
Recomendado
Clasificación