自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(70)
  • 收藏
  • 关注

原创 牛客SQL144——每月及截止当月答题情况

思路:因为有一个项是要新增人数,所以需要筛选出每个用户第一次登录时间,然后连接exam_record表直接把每月总的人数和新增人数计算出来。剩下的最大每月新增人数和累计新增人数,可以通过窗口函数进行计算。

2023-04-13 17:16:42 184

原创 牛客SQL143——每份试卷每月作答数和截止当月的作答总数。

思路:每份试卷每个月的累计数量比较好求,总体的累计可以使用窗口函数进行sum,和普通的sum其实差不太多。

2023-04-13 16:30:08 198

原创 SQL——求用户最长连续登录时间

思路:1.如果同一天登录有多条数据的话,首先先对id和日期进行去重。3.如果是连续登录的话,当天日期减去排名得到的日期应该是相同的。4.计算得到日期相同的天数,按照id和减去得到的日期进行分组。2.通过窗口函数对每个人的登录时间进行排序。5.最后找到最大的连续天数。

2023-04-08 00:18:38 2056

原创 牛客JZ37——序列化二叉树(java)

思路:先把树用前序遍历输出,然后在通过前序构造树;

2023-03-27 21:00:20 107

原创 牛客JZ36——二叉搜索树与双向链表(JAVA)

思路:双向链表的结构其实就是中序遍历,可以先将数据转为中序遍历的数组,最后在遍历数组,新建链表。而树中的right就可以看做是双向链表中的next,而left就可以看做是双向链表的pre。

2023-03-27 17:23:05 39

原创 牛客JZ35——复杂链表的复制(JAVA)

方法一:使用hash表,首先遍历链表,把节点本身和新建的对应节点都放入map中,然后再一次遍历链表,并从hash表中取出对应的值。把每一个节点复制并且插入原来的链表中,即原来1-2-3变成1-1(拷贝)-2-2(拷贝)-3-3(拷贝)思路:因为不可以用原来链表中的结点,所以链表里面的每一个节点我们都要重新新建一遍。然后再次遍历链表把对应的random指针也进行拷贝。最后再次遍历链表将链表拆成两个链表即可。head作为第二次遍历链表的头结点。pHead作为放入map的数据。res链表为返回的结果。

2023-03-27 16:37:20 230

原创 牛客SQL141——试卷完成数同比2020年的增长率及排名变化

请计算2021年上半年各类试卷的做完次数相比2020年上半年同期的增长率(百分比格式,保留1位小数),以及做完次数排名变化,按增长率和21年排名降序输出。1.先计算2020,2021年上半年每一类试卷。

2023-03-27 13:09:28 145

原创 牛客SQL140——未完成率较高的50%用户近三个月答卷情况

思路:请统计SQL试卷上未完成率较高的50%用户中,6级和7级用户在有试卷作答记录的近三个月中,每个月的答卷数目和完成数目。按用户ID、月份升序排序。5.有试卷作答记录的近三个月。3.较高的50%用户。

2023-03-27 12:30:24 160

原创 牛客SQL138——连续两次作答试卷的最大时间窗

思路:请计算在2021年至少有两天作答过试卷的人中,计算该年连续两次作答试卷的最大时间窗days_window,那么根据该年的历史规律他在days_window天里平均会做多少套试卷,按最大时间窗和平均做答试卷套数倒序排序。1.# 先找到在2021年至少做了两天试卷的人。2.计算时间窗,先找到连续第二次作答的时间。3.#计算最大时间窗,以及平均时间。

2023-03-27 11:24:38 89

原创 牛客SQL137——第二快/慢用时之差大于试卷时长一半的试卷

思路:找到第二快和第二慢用时之差大于试卷时长的一半的试卷信息,按试卷ID降序排序。先按照试卷进行排序,分别升序和降序取出第二块和第二慢。在对时间之差进行计算,记得要distinct。

2023-03-27 10:15:55 84

原创 牛客SQL136——每类试卷得分前3名

思路:找到每类试卷得分的前3名,如果两人最大分数相同,选择最小分数大者,如果还相同,选择uid大者。1.先选出每个人每类的最高和最低分。2.在根据每个试卷进行排序。

2023-03-27 09:48:56 179

原创 牛客JZ34——二叉树中和为某一值的路径(二)

再判断如果root就是叶节点,并且exceptnumber=0说明是符合题意的路径,就把path加到res中。不然的话把root添加到path中,并且将exceptnumber-root.val。dfs函数:首先判断如果root为空,即到尾巴了,就直接return即可;思路:dfs的方法,每次选择左子或者右子,计算权重。定义一个二维数组res用来存放符合题目的路径。每次递归完以后,要把自己这个点从路径上删除。递归进入左子树和右子树进行路径选择。定义一个链表用于存放当前路径。

2023-03-26 12:59:52 33

原创 牛客JZ33——二叉搜索树的后序遍历序列(JAVA)

check的工作:从尾巴开始走,找到第一个比根节点小的位置,那么前面的就是左子树,后面的就是右子树。可以看到右子树都是比根节点的大,只要判断左子树是不是有比根节点大的,如果有就不合法。在检查函数中,找到根节点的左子树和右子树,在递归判断左子树和右子树是否合法。判断完根节点的左子树和右子树之后,再递归对左子树和右子树进行递归判断。思路:首先判断是不是空树。

2023-03-26 12:37:00 34

原创 牛客SQL135——每个6/7级用户活跃情况

思路: 请统计每个6/7级用户总活跃月份数、2021年活跃天数、2021年试卷作答活跃天数、2021年答题活跃天数,按照总活跃月份数、2021年活跃天数降序排序。代码合并,使用left join进行连接,但是因为我们在每一个小块里面已经是left join了所以最后大表链接的时候也可以直接用join。本题的难度在于要查找的东西太多了,很难一步写出来,可以先根据每个要求写出对应的sql最后在连接到一个大表里即可。4.2021年试卷作答活跃天数。5.2021年答题活跃天数。3.2021年活跃天数。

2023-03-26 12:04:32 154

原创 牛客SQL134——满足条件的用户的试卷完成数和题目练习数

思路:# 请你找到高难度SQL试卷得分平均值大于80并且是7级的红名大佬,统计他们的2021年试卷总完成次数和题目总练习次数,只保留2021年有试卷完成记录的用户。结果按试卷完成数升序,按题目练习数降序。需要注意在where的时候and(year(p.submit_time)=2021 or p.submit_time is null),里面的or要包在and 里面。先去找满足条件的红名大佬id,然后在根据id去统计他们的做题数。

2023-03-26 10:57:15 103

原创 牛客剑指JZ26——树的子结构

以节点root1开始比较和B是不是相同,再递归比较是不是root1的左子树的一部分,再递归比较是不是右子树的一部分。思路:树A和树B比较,如果其中一个是空树,那就不存在是不是A的一部分了,可以直接返回false;fun函数进行比较A和B,如果树A为空而树B不为空,说明匹配失败返回false。如果节点值相同,在比较两棵树的左子和右子是不是相同。如果B空了,那说明已经匹配完了,返回true。如果节点值不同,说明不匹配,返回true。fun函数时判断是不是相同的两棵树。

2023-03-25 23:31:29 36

原创 牛客剑指JZ31——栈的压入、弹出序列

思路:使用一个辅助栈,按照顺序,栈顶为空或者栈顶元素和popA元素不相同的时候就把popA的数据进栈(记得要用while,所以要加判断条件j

2023-03-25 21:35:23 46

原创 牛客剑指offerJZ24——反转链表(java)

思路:第一种方法:快慢指针,fast每次走两步,slow每次走一步,如果这两个指针会相遇,则说明有环。第二种方法:使用hash表,遍历链表把节点的值放大hash表中,如果第二次出现,那就是循环的入口。要判断入口是哪里,可以 让slow指针再回到起点,两个指针都一步一步走,最后就会在入口相遇。

2023-03-25 13:08:36 64

原创 牛客SQL128——未完成试卷数大于1的有效用户

对一组数据进行拼接使用group_concat(distinct concat_ws(‘:’,date(start_time),tag),seperate ‘;对一条数据进行拼接使用concat_ws(‘:’,date(start_time),tag)对聚合数据进行选择不能用where要用having。这道题难的地方是在detail如何进行拼接,

2023-03-25 12:34:14 67

原创 牛客SQL127——月总刷题数和日均刷题数

因为会出现only group by问题,所以使用any_value。在最后记得加上where score is not null。思路:这题小问题很多。

2023-03-25 12:21:34 48

原创 牛客SQL126——平均活跃天数和月活人数

计算活跃多少天不能直接count submit_time,因为同一个人可能在同一天活跃多次,所以得对uid和submit_time一起进行count。要先计算出一共活跃了多少天,再除以去重以后的活跃人数count(distinct uid)思路:返回一个month为202107的格式,首先先对submit_time格式进行转换。月度活跃人数mau,直接count distinct uid即可。平均月活跃天数avg_active_days。

2023-03-25 11:46:05 351

原创 牛客SQL124——统计作答次数

对score先使用一个if判断,把exam_id附上去然后在去重,就可以得到已完成的试卷总数。或者是在使用一个select对exam_id去重计算并且去掉没有分数的数据。对sumbit_time使用count可以得到试卷的完成总数。思路:对id直接使用count就可以算出作答总次数,

2023-03-25 11:20:20 57

原创 牛客SQL119——修改表

alter table 表名 add column 列名 类型 【first|after 字段名】;alter table 表名 modify column 列名 新类型 【新约束】;alter table 表名 modify column 列名 类型 first;alter table 表名 change column 旧列名 新列名 类型;alter table 表名 rename 【to】 新表名;alter table 表名 drop column 列名;6.将某一列放到第一列。

2023-03-25 10:54:07 47

原创 牛客剑指offerJZ20——表示数值的字符串(python)

’ 匹配数字或者是数字+小数点+数字或者是数字+小数点,且小数点+数字只能匹配1次或者0次,小数点后面的数字也是0到1次(因为可能是3.)因为数字,数字加小数点,数字加小数点加数字和小数点加数字是或者的关系,所以用|,而这两者后面都可以加上指数的Ee,所以不需要再用或者。'匹配Ee的情况,这种情况也只能出现0,1次,而Ee后面的正负号也是只能出现0或1次。'(.\d+)'匹配小数点加数字的情况。’ 匹配一个或者0个±号。思路:可以直接使用正则表达式。

2023-03-24 13:11:08 47

原创 牛客SQL112——插入记录(三)

replace into:表示插入并替换数据,若表中有primary key或者unique索引,在插入数据的时候,若遇到重复的数据,则用新数据替换,如果没有数据效果则和insert into一样;思路:一种方法是先从表中删除id为9003的试卷再进行插入,记得delete语句后面要加;第二种方法是使用replace into。

2023-03-24 09:29:58 44

原创 牛客SQL第111题——插入记录(二)

insert into 后面的values可以直接通过select,但是注意不用再加values。

2023-03-24 09:18:50 40

原创 力扣Hot100第53题——最大子数组和(Python)

思路:采用动态规划的方法,以当前点为结束点,判断前面的子串对自己是正向作用还是负作用,Max用来记录最大的子串和,presum是当前点之前的子串和。3.presum=7是正数,对当前nums[i]是益处,所以presum=6,子串是[3,4,-1],但是此时的Max还是7。2.presum=3,是正数,对当前nums[i]是益处,所以presum=7,子串为[3,4],这是Max=7。输入:nums = [-2,1,-3,4,-1,2,1,-5,4]输入:nums = [5,4,-1,7,8]

2023-03-23 23:50:56 124

原创 牛客剑指offerJZ8——二叉树的下一个节点

题目说传入的pnode是局部子树,我们不能肯定就是父节点,所以我们要寻找父节点,因为其他节点的next指针都指向他的父节点,那么我们只要找到next=null的结点就是父节点。要找到中序遍历的下一个节点,可以直接进行中序遍历,然后在中序遍历中找到根节点的位置,在返回他的下一个位置即可。

2023-03-20 11:44:42 41

原创 牛客SQL34——统计复旦用户8月练题情况

思路:首先要把两个表进行连接,并且是外连接,要在连接的时候就选择8月份的,如果之后再where中选择8月份数据的话,那没做题的人的数据就会消失了。在count()right答案的题目数的时候,可以在count中添加条件,但是记得要加or null,或者使用if条件。也可以使用sum结合if进行计数。

2023-03-19 13:28:26 144

原创 牛客SQL33——找出每个学校GPA最低的同学

row_number,partition by 选择按照university进行分区,order by 按照gpa进行排序。思路:如果直接用min(gpa)的话是得不到最小gpa对应的device_id数据的,所以使用窗口函数。

2023-03-19 12:50:54 362

原创 牛客SQL29——计算用户的平均次日留存率

思路:将表进行连接,找到第一天去同时第二天也去的人数。

2023-03-19 12:25:23 173

原创 牛客SQL26——计算25岁以上和25岁以下的用户数量

先使用if条件语句判断age归类到25岁以上和25岁以下,根据age分组,再计算人数。

2023-03-19 11:52:37 94

原创 牛客SQL25——查找山东大学或者性别为男生的信息

思路:题目要求不去重显示,如果直接在where中使用university=‘山东大学’ or gender='male’的话,结果是去重的,使用union也是去重的,所以需要使用union all。

2023-03-19 11:45:42 98

原创 牛客SQL基础——统计每个学校的答过题的用户的平均答题数

思路:首先连接user_profile和question_practice_detail,按照学校进行分组。计算平均做题数可以用question_id总数/的device_id数。

2023-03-19 11:30:43 129

原创 力扣Hot100第34题——在排序数组中查找元素的第一个和最后一个位置(Python)

找target位置的方法和普通的二分法相同,但是1.nums[mid]=target的时候我们要接着往前面找找还有没有等于target的,所以right=mid-1。例如5,7,7,8,8,10,11,第一次循环nums[mid]=nums[3]=8>7,right=2。输入:nums = [5,7,7,8,8,10], target = 8。输入:nums = [5,7,7,8,8,10], target = 6。第三次循环nums[mid]=nums[4]=8

2023-03-13 18:10:36 138

原创 力扣Hot100第33题——搜索旋转排序数组(Python)

nums[n-1], nums[0], nums[1], …例如, [0,1,2,4,5,6,7] 在下标 3 处经旋转后可能变为 [4,5,6,7,0,1,2]。因为不管怎么进行旋转,假设0,1,2,4,5,6,7,在下标处为2的位置进行旋转变为2,4,5,6,7,0,1,可以看到两边还是有保持着某种顺序的。输入:nums = [4,5,6,7,0,1,2], target = 0。输入:nums = [4,5,6,7,0,1,2], target = 3。如果都没有则返回-1。

2023-03-13 17:42:18 93

原创 力扣Hot100第31题——下一个排序(Python)

从右边开始找,找到第一个升序对a[i]

2023-03-13 16:37:15 76

原创 力扣Hot100第22题——括号生成(python)

1.1.1.1.1.1.1 因为left=3,而right

2023-03-03 16:00:18 129

原创 力扣Hot100第19题——删除链表的倒数第N个节点(JAVA)

思路:双指针方式,设置fast指针和slow指针。fast指针比slow指针提前n个,当fast指针到尾巴null的时候,slow指针的next指针刚好指向要删除的结点。注意:如示例2中head=[1],n=1的情况,如果slow指向的是1的话,不存在slow.next.next。输入:head = [1,2,3,4,5], n = 2。输入:head = [1,2], n = 1。输入:head = [1], n = 1。进阶:你能尝试使用一趟扫描实现吗?输出:[1,2,3,5]

2023-03-02 14:50:32 134

原创 力扣Hot100第17题——电话号码的字母组合(python)

用回溯的方法,先把第一个字母的可能列出来,并且带着这个字母去找对应的第二个第三个字母的可能,当字母串的长度等于数字串的长度的时候,把这个结果加到列表中。输出:[“ad”,“ae”,“af”,“bd”,“be”,“bf”,“cd”,“ce”,“cf”]给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。digits[i] 是范围 [‘2’, ‘9’] 的一个数字。输入:digits = “23”输出:[“a”,“b”,“c”]输入:digits = “2”输入:digits = “”

2023-03-02 14:15:35 319

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除