leetcode_136 + 141 只出现一次的数字+单链表判断环

set也有很多用,不要只看到了dict的作用

  1. 只出现一次的数字
class Solution:
    def singleNumber(self, nums: List[int]) -> int:
        '''
        di = {}
        for i in nums:
            if i not in di.keys():
                di[i] = 1
            else:
                di[i]+= 1
        print(di)
        return [k for k,v in di.items() if v==1][0]
        '''
        # 集合的方法
        # set 可以用来判断元素的个数!!!
        s = set()
        for i in nums:
            if i in s:
                s.remove(i)
            else:
                s.add(i)
        # print(s)
        return list(s)[0]

2. 单链表判断环

# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def hasCycle(self, head: ListNode) -> bool:
        '''set 可以用于解决重复问题   双指针可用于单链表是否有环的判断o(1)'''
        # set  自己写的
        
#         s = set()
#         node = head
#         while node:
            
#             if node not in s:
#                 s.add(node)
#                 node = node.next
#                 continue
#             return True
#         return False
        # 双指针 第一个指针 p1 每次移动两个节点,第二个指针 p2 每次移动一个节点,如果该链表存在环的话,第一个指针一定会再次碰到第二个指针,反之,则不存在环
        p1 = head
        p2 = head
        # 遍历的条件值得注意一下 ! ! !!!!!!!!!!!!!!!!!!!!!!!!!!p1比p2走得快,只判断p1即可
        while p1 && p1.next:
            p1 = p1.next.next
            p2 = p2.next
            
            if p1==p2:
                return True
        return False

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值