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;
}