链接
https://leetcode-cn.com/problems/single-number/
前言
靠着异或运算有一些思路,但是关键概念忘了:a^0=a
异或的核心概念还得再捋捋:
题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
- 示例 1:
输入: [2,2,1]
输出: 1
- 示例 2:
输入: [4,1,2,1,2]
输出: 4
思路1
- 1.用len函数求出给定数组的元素个数
- 2.将数组中的元素循环循环做异或操作:相同的元素得0,并通过交换律将单独存在的那个元素与0做异或,由公式
a^0=a
得到单独存在的那个元素
class Solution:
def singleNumber(self, nums: List[int]) -> int:
n = len(nums)
a = 0
for i in range(n):
a = a^nums[i]
return a
- 关键
a^0=a
a^a=0
a^ b ^a = a ^ a ^ b = 0 ^ b =0'b+0b'=b
两个十进制数做异或操作,先把十进制转二进制,然后对应位做异或,得到的结果再转回十进制,见下图:
疑问
说明上要求:你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
- 1.什么是线性复杂度?
- 即O(n)
- 2.不使用额外空间又是什么?