[leetcode]136. 只出现一次的数字


题目 136. 只出现一次的数字

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

说明:

你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?

示例

示例 1:
输入: [2,2,1]
输出: 1
示例 2:
输入: [4,1,2,1,2]
输出: 4

方法一 数组

解题思路
  • 题目说 其余每个元素均出现两次,那么当元素第一次出现,则添加到数组,再次出现则删除该元素
  • 除了某个元素只出现一次以外,那么剩下的最后一个元素 就是题解
def singleNumber(nums):
    no_duplicate_list = []
    for num in nums:
        if num not in no_duplicate_list:
            no_duplicate_list.append(num)
        else:
            no_duplicate_list.remove(num)
    return no_duplicate_list.pop() # 在 数组中取出该数字
复杂度分析
  • 时间复杂度度: O ( n ) O(n) O(n) 如果当前数组的长度为 n n n ,则每个元素遍历一遍,则为 n n n
  • 空间复杂度度: O ( n / 2 + 1 ) O(n/2+1) O(n/2+1) ,如果当前数组 前 n / 2 + 1 n/2+1 n/2+1 个元素为不同元素,则最长需保存 n / 2 + 1 n/2+1 n/2+1 个元素

方法二 位运算

解题思路
  • 交换律: p ⊕ q = q ⊕ p p⊕q=q⊕p pq=qp
  • 结合律: p ⊕ ( q ⊕ r ) = ( p ⊕ q ) ⊕ r p⊕(q⊕r)=(p⊕q)⊕r p(qr)=(pq)r
  • 恒等率: p ⊕ 0 = p p⊕0=p p0=p
  • 归零率: p ⊕ p = 0 p⊕p=0 pp=0

代码

java
class Solution {
    public int singleNumber(int[] nums) {
        int sum = 0;
        for(int i=0;i<nums.length;i++) {
            sum ^= nums[i]; // 异或
        }
        return sum;

    }
}
python
class Solution(object):
    def singleNumber(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """
        sum = 0
        for num in nums:
            sum ^= num
        return sum

复杂度分析
  • 时间复杂度度: O ( n ) O(n) O(n) 如果当前数组的长度为 n n n ,则每个元素遍历一遍,则为 n n n
  • 空间复杂度度: O ( 1 ) O(1) O(1)

  • 如果你觉得本文对你有帮助,请点赞👍支持
  • 如果有疑惑或者表达不到位的额地方 ,请在下面👇评论区指出
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值