Em 3 de julho de 2023, leetcode verifica uma pergunta por dia - 136. Números que aparecem apenas uma vez

1. Descrição e requisitos do tópico

136. Números que aparecem apenas uma vez - LeetCode

descrição do tópico

Dado um array inteiro não vazio nums, cada elemento aparece duas vezes, exceto para um determinado elemento que aparece apenas uma vez. Encontre o elemento que aparece apenas uma vez.

Você deve projetar e implementar um algoritmo de complexidade de tempo linear para resolver este problema que usa apenas espaço extra constante .

exemplo

Exemplo 1:

输入:nums = [2,2,1]
输出:1


Exemplo 2:

输入:nums = [4,1,2,1,2]
输出:4


Exemplo 3:

输入:nums = [1]
输出:1


dica

  • 1 <= nums.length <= 3 * 104
  • -3 * 104 <= num[i] <= 3 * 104
  • Cada elemento aparece duas vezes, exceto um elemento que aparece apenas uma vez.

2. Ideias para resolução de problemas

Ideia geral:

       Primeiramente analise o tópico, a exigência do tópico é encontrar o número que aparece apenas uma vez no array, então precisamos pensar em como encontrar esse número. E o título exige que apenas espaço extra constante possa ser usado, ou seja, variáveis ​​com vários espaços como arrays não podem ser usadas para resolver o problema. Ao mesmo tempo, a complexidade de tempo também deve ser linear.

        A maneira mais fácil é contar o número de ocorrências de cada número (o título estipula que outros números aparecem apenas duas vezes), comparar o número na matriz com cada elemento da matriz diferente dele e aumentar o número de vezes se forem o mesmo Depois de percorrer a comparação Determine se o número de vezes é 1 e, se for 1, atribua esse número ao resultado. Repita as etapas acima até que toda a matriz seja percorrida. [O método de implementação mais simples, mas expirará. Complexidade de tempo O(n²) Complexidade de espaço é O(1)]

       Outro método é usar a operação XOR na operação de bit para encontrar o número que aparece apenas uma vez. a⊕0=a. a⊕a=0. a⊕b⊕a=b⊕a⊕a=b⊕(a⊕a)=b⊕0=b. Portanto, o primeiro valor da matriz pode ser atribuído ao resultado e, em seguida, o resultado e os elementos na matriz podem ser XORed e, finalmente, o número de destino pode ser obtido. [Precisa estar familiarizado com a natureza das operações de bit]

Etapas específicas:

Método de passagem de loop aninhado:

① Defina as variáveis ​​auxiliares result e count, o valor inicial de result é definido casualmente e o valor inicial de count é definido como 1 na primeira camada do loop for

②O loop for aninha o loop for, compara o número no array com cada elemento do array diferente dele e julga se o número é 1 e, se for 1, atribui esse número ao resultado.

③resultado de retorno

Método de operação XOR:

①Defina a variável auxiliar result=nums[0]

② Use o loop for para percorrer o array, XOR o resultado com cada elemento do array e salve o resultado

③resultado de retorno


3. Código específico [linguagem C]

Método de travessia de loop aninhado: [tempo O(n²) espaço O(1)] tempo limite de envio do leetcode

int singleNumber(int* nums, int numsSize) {
    if (numsSize == 1)  return nums[0];//如果数组只有一位的话则直接输出
    int result = 0;
    int count;
    //遍历整个数组,统计出现次数
    for (int i = 0; i < numsSize; i++) {
        count = 1;
        for (int j = 0; j < numsSize; j++) {
            if (j != i) {
                if (nums[i] == nums[j]) {
                    ++count;//有重复的,次数+1
                }
            }
        }
        if (count == 1)//只出现一次
        {
            result = nums[i];
        }
    }
    return result;
}

② Método de operação XOR : [Tempo O(n) Espaço O(1)]

int singleNumber(int* nums, int numsSize){
    if (numsSize == 1)  return nums[0];//如果数组只有一位的话则直接输出
    int result = nums[0];
    //遍历整个数组
    for (int i = 1; i < numsSize; i++) {
        result^=nums[i];
    }
    return result;
}

おすすめ

転載: blog.csdn.net/m0_59800431/article/details/131514750