【力扣】136. 只出现一次的数字

简介: 【力扣】136. 只出现一次的数字

题目描述

给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

示例 1 :

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

输出:1

示例 2 :

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

输出:4

示例 3 :

输入:nums = [1]

输出:1


提示:

  • 1 <= nums.length <= 3 * 104
  • -3 * 104 <= nums[i] <= 3 * 104
  • 除了某个元素只出现一次以外,其余每个元素均出现两次。


解题方案

暴力破解

不考虑时间复杂度和空间复杂度限制

  • C
int singleNumber(int* nums, int numsSize) {

    for(int i = 0; i < numsSize; i++)
    {
        for(int j = i + 1; j < numsSize; j++)
        {
            if(nums[i] == nums[j])
            {
                nums[i] = 0;
                nums[j] = 0;
            }
        }

        if(nums[i] != 0)
        {
            return nums[i];
        }
    }

    return 0;
}

位运算-异或运算法:

根据异或运算的性质,数组中的全部元素的异或运算结果即为数组中只出现一次的数字。


异或性质

(1)交换律: A ^ B = B ^ A

(2)结合律: ( A ^ B ) ^ C = A ^ ( B ^ C )

(3)自反性: A ^ B ^ B = A (由结合律可推: A ^ B ^ B = A ^ ( B ^ B ) = A ^ 0 = A)


  • C
int singleNumber(int* nums, int numsSize) {

    int temp = 0;

    for(int i = 0; i < numsSize; i++)
    {
        temp ^= nums[i];
    }

    return temp;
}


复杂度分析

  • 时间复杂度:O(n),其中 n 是数组长度。
  • 空间复杂度:O(1)。


相关文章
|
6月前
|
算法
leetcode-136:只出现一次的数字
leetcode-136:只出现一次的数字
32 0
【力扣每日一题】1365. 有多少小于当前数字的数字
【力扣每日一题】1365. 有多少小于当前数字的数字
|
1月前
|
算法
Leetcode(只出现一次的数字)
这篇文章介绍了如何使用位异或运算法则解决LeetCode上的一个编程问题,即在数组中找出只出现一次的数字,而其他数字都出现两次。
13 0
|
6月前
leetcode:476. 数字的补数
leetcode:476. 数字的补数
109 0
|
6月前
|
算法
leetcode-260:只出现一次的数字 III
leetcode-260:只出现一次的数字 III
38 0
|
算法 Java C语言
leetcode之只出现一次的数字
今天为大家分享的是关于在数组中找到只出现一次数字的系列题目,我将使用c跟Java来实现,希望我的分享能够帮助到大家。
|
存储
剑指offer 63. 和为S的两个数字
剑指offer 63. 和为S的两个数字
77 0
|
机器学习/深度学习 算法
【LeetCode】只出现一次的数字
【LeetCode】只出现一次的数字
【LeetCode】只出现一次的数字
|
Python
LeetCode 476. 数字的补数
给你一个 正 整数 num ,输出它的补数。补数是对该数的二进制表示取反。
98 0
|
Python
LeetCode 1323. 6 和 9 组成的最大数字
给你一个仅由数字 6 和 9 组成的正整数 num。
102 0