算法练习|Leetcode234回文链表 ,Leetcode160相交链表,Leetcode1934确认率,Leetcode2356每位教师所教授的科目总类的数量

一、Leetcode234回文链表

题目描述

给你一个单链表的头节点 head ,请你判断该链表是否为
回文链表
。如果是,返回 true ;否则,返回 false 。

在这里插入图片描述

题目链接:力扣题目链接

解题思路

  • 把链表放入数组比较好操作
  • 用切片证明回文
  • 用双指针证明回文

方法:双指针

  • 用left,right从数组两端往中间走
  • 条件为while left < right
  • 不相等就返回false
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, val=0, next=None):
#         self.val = val
#         self.next = next
class Solution:
    def isPalindrome(self, head: Optional[ListNode]) -> bool:
        # 将链表放入数组
        cur = head
        nums = []
        while cur:
            nums.append(cur.val)
            cur = cur.next
        # 用数组切片判断是否回文
        # return nums == nums[::-1]
        # 用双指针判断是否回文
        left, right = 0, len(nums)-1
        while left < right:
            if nums[left] == nums[right]:
                left += 1
                right -= 1
            else:
                return False
        return True
        

总结

  • 链表不好操作就放入数组
  • 数组切片,双指针都很好用!!!


二、Leetcode160相交链表

题目描述

给你两个单链表的头节点 headA 和 headB ,请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点,返回 null

图示两个链表在节点 c1 开始相交:
在这里插入图片描述
题目数据 保证 整个链式结构中不存在环。

注意,函数返回结果后,链表必须 保持其原始结构

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

题目链接:力扣题目链接

解题思路

  • 把链表放到数组操作
  • 相交链表尾部对齐,从后往前找

方法:链表转数组

  • 将节点放入数组
  • 尾部对齐,从数组的下标-1开始找
  • 找到相等的就返回节点
# Definition for singly-linked list.
# class ListNode:
#     def __init__(self, x):
#         self.val = x
#         self.next = None

class Solution:
    def getIntersectionNode(self, headA: ListNode, headB: ListNode) -> Optional[ListNode]:
        # 转换成数组
        a = []
        b = []
        
        cur = headA
        cur2 = headB

        while cur:
            a.append(cur)
            cur = cur.next
        while cur2:
            b.append(cur2)
            cur2 = cur2.next
        
        intersection_node = None
        for i in range(1, min(len(a), len(b)) + 1):
            if a[-i] == b[-i]:
                intersection_node = a[-i]

        return intersection_node
             

总结

  • 注意返回节点,所以放入数组的就是节点不是val
  • 从后往前遍历
    i in range(1,len()+1)
    操作a[-i]


三、Leetcode1934确认率

题目描述

在这里插入图片描述
用户的 确认率 是 ‘confirmed’ 消息的数量除以请求的确认消息的总数没有请求任何确认消息的用户的确认率为 0 。确认率四舍五入到 小数点后两位 。

编写一个SQL查询来查找每个用户的 确认率 。

以 任意顺序 返回结果表。

查询结果格式如下所示。
在这里插入图片描述
在这里插入图片描述

题目链接:力扣题目链接

解题思路

  • 确认率比较难计算
    round取小数点后两位
    ifnull(X,0)没有值就返回0
    avg()计算平均值

方法:round, ifnum(), avg()

# Write your MySQL query statement below
select
    s.user_id,
    round(ifnull(avg(c.action = "confirmed"), 0), 2) as confirmation_rate
from
    Signups as s
left join
    Confirmations as c
    on s.user_id = c.user_id
group by
    s.user_id
    

总结

  • avg()直接取分子,下面group by会给分母
  • round()和ifnull()用法


四、Leetcode2356每位教师所教授的科目总类的数量

题目描述

在这里插入图片描述
查询每位老师在大学里教授的科目种类的数量

以 任意顺序 返回结果表。

查询结果格式示例如下。
在这里插入图片描述

题目链接:力扣题目链接

解题思路

  • 根据每个teacher_id找不重复的subject_id

方法:count, distinct

# Write your MySQL query statement below
select
    teacher_id,
    count(distinct(subject_id)) as cnt
from
    Teacher 
group by
    teacher_id 

总结

  • count和distinct思路还是比较好想到的


心得:算法练习第二天了,保持做题的手感,有空要回去练练回溯,贪心和动态规划了…

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值