• 【LeetCode】136. 只出现一次的数 python


    目录

    题目描述

    第一次刷题

    第二次刷题

    异或运算的规则


    题目描述

    给你一个 非空 整数数组 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
    著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

    第一次刷题

    1. class Solution:
    2. def singleNumber(self, nums: List[int]) -> int:
    3. j = 0
    4. for i in range(len(nums)):
    5. if nums.count(nums[i])==1:
    6. j = i
    7. break
    8. return nums[j]

    第二次刷题

    1. class Solution:
    2. def singleNumber(self, nums: List[int]) -> int:
    3. res = 0
    4. for num in nums:
    5. res ^= num
    6. 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 ^ 1 == 0
    2. 1 ^ 2 == 3
    3. 1 ^ 3 == 2
    4. 1 ^ 4 == 5
    5. 1 ^ 5 == 4
    6. 1 ^ 6 == 7
    7. 1 ^ 7 == 6
    8. 1 ^ 8 == 9
    9. 1 ^ 9 == 8

  • 相关阅读:
    【学习笔记】正则表达式及其在VS Code,Word中查找替换的应用
    微服务技术发展
    这3点职场社交小心机,建议收藏使用
    web安全漏洞
    Oracle 11g_FusionOS_安装文档
    Linux常用命令操作
    java基于web的工资管理系统
    简单宿舍管理系统(springboot+vue)
    WebSocket 的 6 种集成方式
    LINUX下查看CPU负载的所有命令
  • 原文地址:https://blog.csdn.net/weixin_61057398/article/details/131153419