• leecode#只出现一次数字#环形链表


    题目描述:

    给你一个 非空 整数数组 nums ,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。

    你必须设计并实现线性时间复杂度的算法来解决此问题,且该算法只使用常量额外空间。

    分析:

    1. 交换律:a ^ b ^ c <=> a ^ c ^ b

    2. 任何数于0异或为任何数 0 ^ n => n

    3. 相同的数异或为0: n ^ n => 0

    代码:

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

    异或有交换律定理,相当于将相同的数字先异或,这样两两异或就只剩0了,然后0再和最后的一个数字异或得到最终值

    题目描述:

    给你一个链表的头节点 head ,判断链表中是否有环。

    如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表示链表尾连接到链表中的位置(索引从 0 开始)。注意:pos 不作为参数进行传递 。仅仅是为了标识链表的实际情况。

    如果链表中存在环 ,则返回 true 。 否则,返回 false 。

    分析:

    最容易想到的方法是遍历所有节点,每次遍历到一个节点时,判断该节点此前是否被访问过。

    具体地,我们可以使用哈希表来存储所有已经访问过的节点。每次我们到达一个节点,如果该节点已经存在于哈希表中,则说明该链表是环形链表,否则就将该节点加入哈希表中。重复这一过程,直到我们遍历完整个链表即可。

    代码:

    1. class Solution:
    2. def hasCycle(self, head: ListNode) -> bool:
    3. seen = set()
    4. while head:
    5. if head in seen:
    6. return True
    7. seen.add(head)
    8. head = head.next
    9. return False

    set() 函数创建一个无序不重复元素集,可进行关系测试,删除重复数据,还可以计算交集、差集、并集等。

  • 相关阅读:
    AI绘画工具汇总
    Vue路由(vue-router)
    React与Vue的区别
    还在为仓库杂乱发愁?教你ABC仓库管理分类法!
    模拟vue动态路由
    Linux系统编程基础:进程控制
    Tez的web UI简单体验
    Ubuntu 22.04 Docker安装笔记
    深度学习AI识别人脸年龄
    一篇文告诉你,当贝超短焦激光投影U1研发“内幕”
  • 原文地址:https://blog.csdn.net/weixin_44267765/article/details/128075644