目录
题目描述
第一次刷题
第二次刷题
异或运算的规则
题目描述
给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。
示例 1 :
输入:nums = [2,2,1]
输出:1
示例 2 :
输入:nums = [4,1,2,1,2]
输出:4
示例 3 :
输入:nums = [1]
输出:1
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/single-number
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
第一次刷题
class Solution:
def singleNumber(self, nums: List[int]) -> int:
j = 0
for i in range(len(nums)):
if nums.count(nums[i])==1:
j = i
break
return nums[j]
第二次刷题
class Solution:
def singleNumber(self, nums: List[int]) -> int:
res = 0
for num in nums:
res ^= num
return res
这道题是一道经典的位运算题目,使用异或运算可以很巧妙地解决。首先,我们需要了解异或运算的性质:
1. 两个相同数字异或=0
2. 一个数和0异或还是它本身
根据这两个性质,我们可以对整个数组进行一次异或运算,最终的结果就是那个只出现一次的数字。(这个解析是正确的。因为异或运算满足交换律和结合律,所以对于一个数组中的所有数字进行异或运算,相同的数字会被抵消掉,最终剩下的就是只出现一次的数字。同时,0和任何数异或都等于这个数本身,所以最终的结果就是那个只出现一次的数字。这个算法的时间复杂度是O(n),空间复杂度是O(1)。)
具体来说,我们可以用一个变量 res 来保存异或的结果,初始值为 0。然后遍历整个数组,对每个数字进行异或运算,将结果保存到 res 中。最终,res 中的值就是那个只出现一次的数字。
这个算法的时间复杂度是 O(n),空间复杂度是 O(1)。因为只需要一个变量来保存异或的结果,不需要额外的空间。
需要注意的是,这个算法只适用于数组中只有一个数字出现一次,其他数字都出现两次的情况。如果数组中有多个数字只出现一次,那么这个算法就不适用了。
总之,这道题所用的思想是非常巧妙的,可以帮助我们更好地理解位运算的性质和应用。
异或运算的规则
这个运算规则是异或运算。异或运算是指对两个二进制数的每一位进行比较,如果相同则该位的结果为0,如果不同则该位的结果为1。因此,对于任意的正整数n,1 ^ n的结果可以按照上述规律进行循环,即每隔4个数就会重复一次。
1 ^ 1 == 0
1 ^ 2 == 3
1 ^ 3 == 2
1 ^ 4 == 5
1 ^ 5 == 4
1 ^ 6 == 7
1 ^ 7 == 6
1 ^ 8 == 9
1 ^ 9 == 8