题目
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
说明:
你的算法应该具有线性时间复杂度。 你可以不使用额外空间来实现吗?
示例 1:
输入: [2,2,1]输出: 1
示例 2:
输入: [4,1,2,1,2]输出: 4
解答 1:
## @lc app=leetcode.cn id=136 lang=python3## [136] 只出现一次的数字## @lc code=startclass Solution:def countLetter(self, arr, v):count = 0for j in arr:if j == v:count = count + 1return countdef singleNumber(self, nums) -> int:for (i, v) in enumerate(nums):if self.countLetter(nums, v) == 1:return vSolution().singleNumber([2, 2, 1,1,3322,22,22])# @lc code=end
Note
两层循环
一层负责遍历列表,另一层则对遍历的每一个值再进行一次遍历,统计这个值出现的次数
复杂度是O(n^2)
结果是超时
解答 2:
## @lc app=leetcode.cn id=136 lang=python3## [136] 只出现一次的数字## @lc code=startclass Solution:def singleNumber(self, nums) -> int:k = nums[0]for (i, v) in enumerate(nums):if i == 0: continuek = (k ^ v)return kSolution().singleNumber([2, 1, 2])# @lc code=end
Note
使用异或运算^
- 交换律:a ^ b ^ c <=> a ^ c ^ b
- 任何数于0异或为任何数 0 ^ n => n
- 相同的数异或为0: n ^ n => 0
[2, 2, 1]
2^2 = 10^10 = 0
0^1 = 00^01 = 1
[2, 1, 2]
2^1 = 10^01 = 3
3^2 = 11^10 = 1
