• 【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

  • 相关阅读:
    javaee网络原理初始
    Android OkHttp/Retrofit框架使用Interceptor 抓包/mock数据
    健与美杂志健与美杂志社健与美编辑部2022年第7期目录
    C#多线程(三)线程高级篇
    常用函数(睡眠函数、函数耗时)
    前端环境变量及vite中本地环境配置实践
    k8s常用命令2
    [重磅来袭] 功能强大的开源数据中台系统 DataCap 1.14.0 发布
    电容笔和Apple pencil有什么区别?Ipad好用电容笔排行榜
    翻译QT使用手册:将库添加到项目
  • 原文地址:https://blog.csdn.net/weixin_61057398/article/details/131153419