① 想刷题,看这份私藏了多年的刷题网站就行了
遥想当年,机缘巧合入了 ACM 的坑,周边巨擘林立,从此过上了"天天被虐似死狗"的生活…
然而我是谁,我可是死狗中的战斗鸡,智力不够那刷题来凑,开始了夜以继日哼哧哼哧刷题的日子,从此"读题与提交齐飞, AC 与 WA 一色 ",我惊喜的发现被题虐既刺激又有快感,那一刻我泪流满面。这么好的事儿作为一个正直的人绝不能自己独享,经过激烈的颅内斗争,我决定把我私藏的十几个 T 的,阿不,十几个刷题网站放出来,让我们一起爽!
刷题,是这个世界上最有意思的事儿!
当然刷题不能乱爽,你要知道刷题要干嘛,是找工作面试、研究生复试机试,是参加程序设计竞赛还是为了提高自己,在这里我将这些分为三类:收割 offer 版、ACM 竞赛版和提高版。
一、收割 offer 版
不管是找工作笔试面试白板试进大厂,还是研究生参加初试复试机试,数据结构和算法都是绕不过去的坎,刷题就成了很多人的需求,快来看看下面这些网站,变身刷题机器,收割 offer 吧!
1、leetcode
英文网址:https://leetcode.com/
中文网址:https://leetcode-cn.com/
估计 leetcode(力扣)大家都很熟悉了,都被推荐烂了,很多国内外的程序员在上面刷题,难度从 Easy、Medium 至 Hard 都有,据说很多面试官都会从中挑选各种题目,号称大厂的筛码工。
我很早就知道 leetcode,但是直到准备复试闲来无事的时候才在它上面刷了点儿题找感觉,发现上面的题型覆盖很广,像线段树、滑动数组、博弈论、扫描线等都应有具有,但是好像有的测试数据有点弱?有的题好像可以悄咪咪的水过去…
当然题目都是英文的,现在也有了中文社区,两个网址我都放出来了,还是建议大家首刷英文的,锻炼一下,一举两得,毕竟如果是搞 ACM 的话,题目都是英文的…
2、hihoCoder
网址:https://hihocoder.com
网站的技术团队来自于原北大 POJ 的开发团队,至于 POJ 会在后面的篇章中介绍,反正膜拜就完事了。一些知名的大厂比如微软、网络、腾讯、网易等会在上面举办在线编程比赛,风格倒是和 ACM 比赛类似。
如果仅止步于此还不至于让我推荐,当初与它的结缘是因为 hihoCoder 每周有周赛,每月有月赛。周赛是一道题,题目比较难但是极有意思,可以很好的拓宽自己的解题思路,月赛就更厉害了,题目均出自北大等一流高校玩 ACM 的菊苣出题,通过这个的检验可以迅速定位到自己真实的水平,同时了解自身在解决问题过程中的不足。
这将是展示自我真实水平的绝佳机会。
3、牛客网
网址:https://www.nowcoder.com/
牛客网作为国内内容超级丰富的 IT 题库,各种东西看的我眼花缭乱,题库+面试+学习+求职+讨论 360 度无死角服务,堪称"互联网求职神器"。它好就好在不只是一个刷题的平台,还是一个交流学习的平台,发个问题贴总有热心的大佬帮助,别问我怎么知道,我才不要说我也给人回答过问题…
说句题外话,我与牛客网的结缘还是因为…它上面有考研真题,我刷来着…
4、计蒜客
网址:https://www.jisuanke.com/
计蒜客这个网站可能很多人不知道,他也有可以刷题的题库,也会定期举办比赛,当年和计蒜客有的交集也就是参加计蒜客举办的"计蒜之道"的线上比赛,还赢得过 T 恤,现在好像还在我家放着…
这么多年还记得这个网站的原因,是因为当年在某乎上关注了他们的 CEO,然后竟然被反关,着实把当年的我惊着了…
二、ACM 竞赛版
PS:虽然这一部分的标题为 ACM 竞赛版,也只是因为这些在学校搞 ACM 的同学用的比较多,实际上所有的人都可以在下面这些网站上刷题,题目的质量和广度都是顶呱呱的,男女老少咸宜。
搞 ACM 的时候知道了很多 OJ(Online Judge),比如下图(当然实际的数量肯定远远多于图中所展示的这些):
5、HDU
网址:http://acm.h.e.cn/
杭电(杭州电子科技大学)的 OJ 大概是国内最火的几个 OJ 之一了,大多数 ACMer 应该都知道(其实我想说所有来着),勿需多说,非常多比赛都在上面,比如每年暑假的多校联赛,朝鲜、外蒙等学校的队伍都会参加,想不知道都不可能。
现在上面大概有接近 6k 的题量,网上有很多的刷题顺序,刷题指南,感兴趣的玩玩儿…
6、POJ
网址:http://poj.org/
这个就是我在介绍 hihocoder 的时候提到过的 POJ(Peking University Online Judge),同样作为国内最火的几大 OJ 之一,它的建立时间更早,一些上古时期的题目也能在上面找到,同样 POJ 也很出名,也是我最早刷题的 OJ 之一。
现在上面有 3k+ 的题量,关于 POJ 的刷题指南网上更是很多,同样欢迎去玩儿…
7、SDUT
网址:https://acm.st.e.cn/
这个是我打开次数最多,刷题次数最多的 OJ,是我刷题之路开始的地方 – 我本科母校 SDUT 的 OJ 平台。虽然我们学校不出名,但是我们集训队做东西是认真的,上面有接近 3k 的题量,并且在逐渐增多,简单题多一些,很适合刷题。
欢迎大家注册,多多刷题,我们集训队多年一直秉持开放的态度,欢迎多多交流…
8、其它 OJ
最后附带一些其它同样优秀的 OJ 平台:
国内:
ZJU(浙大): https://zoj.pintia.cn/home
USTC(中科大):http://acm.ustc.e.cn/ustcoj/
FZU(福大):http://acm.fzu.e.cn/
HIT(哈工大):http://acm.hit.e.cn/
国外:
URAL:http://acm.timus.ru/
SPOJ:https://www.spoj.com/
三、提高版
这一部分推荐的网站,非常有意思,如果想提高自己,体验比赛的快感,非常建议尝试。
9、Codeforces
网址:https://codeforces.com/
Codeforces 又被戏称为 CF,是一家俄罗斯的网站,当然还是用英文食用。这里的很好的比赛,很好的题目,很好的选手,简称"三好"。
CF 最吸引人的地方在于它那超级牛批的比赛系统,CF 上每个用户都拥有 Rating,也就是比赛积分,新用户默认为 1500 分,每次比赛就会在你的积分上加加减减,上面的比赛一般分为四种:Div1、Div2、Div3、Ecational Codeforces Round。Div 的比赛一般是根据积分来的,每个积分段只能参加对应的 Div 的比赛,Div1的比赛是里面最难的,大佬基本都在这里。Ecational Codeforces Round 则是类似 ACM 的比赛,提交之后立马出结果。
但是如果仅限这些也算不上超级,还有一个更有意思的是,CF 的比赛还提供一个 hack 功能,通俗点说就是你去看别人提交的代码,然后通过提交你想出的特殊测试用例然后找出别人代码的 bug,hack 成功则加积分,比赛更多了很多乐趣,在 hack 和反 hack 中斗智斗勇。
不过对国内来说,和俄罗斯存在时差,一般想参加比赛的话大多数要在晚上 11 点以后,按照基础的 2 个小时比赛时间,再加上 hack 和测评反馈的过程,然后再刺激一下,差不多一宿就这么交待了,不过其中的乐趣不足为外人道。如果没有时间,上面的题目还是可以自己拿来做的,题目质量超级好,很能锻炼自己。
10、Topcoder
网址:https://www.topcoder.com/
Topcoder 据说是世界上规模最大的编程网站,如果这样的话那这个 Top 就可以理解了,Top 的 coder 丫,这个我基本上没用过,可能是因为我不 Top,只能仰望…
想起它来的原因还是因为现在每次有比赛的时候都会给我发邮箱,搞得我想忘了它都不成…
python学习网,大量的免费python视频教程,欢迎在线学习!
本文转自:https://blog.csdn.net/u013486414/article/details/102961171
接下来,我们将使用员工相关的四张样本数据表,来学习SQL,建议你在学习过程中多动手练习,理解才会更深刻。表和字段含义,如下图:
如何利用SQL语句来操作以上数据呢?我们必须将样本数据导入MySQL客户端(如:Navicat)中。可以在客户端操作数据,或者在终端窗口。工作中经常在客户端操作,所以本文所有SQL语句将在Navicat中学习。
首先将sql脚本保存到桌面(获取方式:关注"Python之每日一课"公众号,后来回复"sql基础数据",即可。),导入SQL脚本的具体操作流程如下:
现在数据准备完成。这里是导入sql脚本;导出同理,选择”转储SQL“文件。当然了,Navicat也支持将当前表或查询结果导出Excel、CSV等文件类型。
下面可以写SQL语句了(每个sql脚本可以保存,下次直接使用),如下:
类似于Python中 :print(要打印的东西)
①通过select查询完的结果 ,是一个虚拟的表格,不是真实存在
② 要查询的东西 可以是常量值、表达式、字段、也可以是函数
补充:可以给字段起别名,好处是提高可读性,更方便理解;多表连接时,区分字段。用AS 或 空格来实现。如下:
2、 条件查询
条件查询:根据条件过滤原始表的数据,查询到想要的数据
1)语法
2)分类
①条件表达式
②逻辑表达式
③模糊查询
⭐ 注意:where 一定要放到 from 后面。NULL 不是假,也不是真,而是"空";任何运算符,判断符碰到NULL,都得NULL;NULL的判断只能用is null,is not null;NULL 影响查询速度,一般避免使值为NULL。exists查询可以与in型子查询互换,它们之间区别以后语句优化时会详细讲解。
3、 排序查询
1)语法
2)举栗
⭐ 注意:order by 一定要放到 语句最后(limit前面)
4、分组查询
1)语法
2)特点
①可以按单个字段分组
②和分组函数一同查询的字段最好是分组后的字段
③分组筛选(where 和 having区别)
④可以按多个字段分组,字段之间用逗号隔开
⑤可以支持排序
⑥having后可以支持别名
3)举栗
⭐ 注意:关键字顺序是where —>group by—>having—>order by—>limit( having不能单独使用,需结合group by ,表示对分组后的结果进行筛选;而 group by 必须结合分组聚合函数一起使用 ,比如:count()、max()等)
5、 常见函数
1)单行函数
2)分组函数
3)分组函数特点
①以上五个分组函数都忽略null值,除了count(*)
②sum和avg一般处理数值型,max、min、count可以处理任何数据类型
③都可以搭配distinct使用,用于统计去重后的结果
④count的参数可以支持:字段、*、常量值,一般放1
6、连接查询(多表查询)
单个表不能满足需求时,需要结合多张表,去除有关联的数据。这时就需要用连接查询,连接查询有三种,通常join使用的最多。
①等值连接的结果 = 多个表的交集
②多个表不分主次,没有顺序要求
③一般为表起别名,提高阅读性和性能
①语法
②好处
语句上,连接条件和筛选条件实现了分离,简洁。
⭐ 注意:左右连接可互换 A left join B 等价于B right join A;内连接是左</pre>
右连接的交集;mysql没有外连接。
自连接相当于等值连接,但是等值连接涉及多个表,而自连接仅仅是它自己。如下:在员工信息表里,查询员工名和直接上级的名。
7、子查询
一条查询语句中又嵌套了另一条完整的select语句,其中被嵌套的select语句,称为子查询或内查询。在外面的查询语句,称为主查询或外查询。
①子查询都放在小括号内
②子查询可以放在from后面、select后面、where后面、having后面,但一般放在条件的右侧
③子查询优先于主查询执行,主查询使用了子查询的执行结果
④子查询根据查询结果的行数不同分为以下两类:
2)举栗
8、分页查询 (可选)
实际web开发中,当显示的数据,一页显示不完时,需要分页提交sql请求。
2)特点
①起始条目索引默认从0开始
②limit子句放在查询语句的最后
③公式:select * from 表 limit (page-1)*sizePerPage,
3)举栗
9、union联合查询
union用于把涉及多个表的SELECT语句的结果组合到一个结果集合中。适用于查询条件较多,多个表之间没有连接关系的场景。</pre>
2)特点
①多条查询语句的查询的列数必须是一致的
②多条查询语句的查询的列的类型几乎相同
③union 代表去重,union all 代表不去重
3)举栗
UNION 和 UNION ALL 运行结果的区别如下:
⭐ 注意:在多个 SELECT 语句中,第一个 SELECT 语句中被使用的字段名称将被用于结果的字段名称。当使用 UNION 时,MySQL 会把结果集中重复的记录删掉,而使用 UNION ALL ,MySQL 会把所有的记录返回,且效率高于 UNION
好,今天学习到这里。工作中用的最多就是查询。如果能消化本文涉及到的所有内容,大概能解决80%的工作需求。本文更多的是原理介绍,例子不多,只有先知道是什么,才能知道怎么学。那么,接下来最重要的是要多练习实践。因为实际的业务场景要复杂很多,给大家推荐两个刷题的网站,力扣和牛客网,里面有大量的sql面试题。能进一步提高我们sql的水平。这篇文章主要是SQL的常用查询。明天继续学习SQL的DML增删改。一起加油!
③ 牛客-SQL13 计算商城中2021年每月的GMV
场景逻辑说明 :
用户将购物车中多件商品一起下单时,订单总表会生成一个订单(但此时未付款, status-订单状态 为 0 ,表示待付款);
当用户支付完成时,在订单总表修改对应订单记录的 status-订单状态 为 1 ,表示已付款;
若用户退货退款,在订单总表生成一条交易总金额为负值的记录(表示退款金额,订单号为退款单号, status-订单状态 为2表示已退款)。
问题 :请计算商城中2021年每月的GMV,输出GMV大于10w的每月GMV,值保留到整数。
思路
1.查出已支付的 status=1的表
注意Hive时间格式化函数与mysql的不同
Hive:DATE_FORMAT(event_time,'yyyy-MM')
mysql:DATE_FORMAT(event_time,'%Y-%m')
2.查出已付款未支付的ststus=0的表(此处把已支付的status=1表过滤掉,但是测试用例中并没有初现已付款和已支付的表重的现象)
3.把以上两个表union即是,没有重复订单的已付款和已支付订单 作为s1表
将s1表按照year=2021过滤,再次按照group by月份聚合sum(total_amount) GMV 查询结果作为s2
4.s2按照GMV》=100000过滤再排序,保存整数
题目不难,总是会漏掉条件 ,第一次提交漏了好多条件, 需要更严谨些。
④ 挑战SQL经典题(一)
建表语句:
表说明:
student(sid,sname,sage,ssex) 学生表
course(cid,cname,tid) 课程表
sc(sid,cid,score) 成绩表
teacher(tid,tname) 教师表
问题:
1、查询“1”课程比“2”课程成绩高的所有学生的学号;(3号-张三)
2、查询平均成绩大于60分的同学的学号和平均成绩;(1、2、3、4号)
3、查询所有同学的学号、姓名、选课数、总成绩;
4、查询姓“李”的老师的个数;(0个)
5、查询没学过“叶平”老师课的同学的学号、姓名; (4号-李四)
6、查询学过“1”并且也学过编号“2”课程的同学的学号、姓名;
(1号-刘一 2号-钱二 3号-张三 6号-赵六 除了4号和5号)---考查EXISTS
7、查询学过“叶平”老师所教的所有课的同学的学号、姓名; (除了4号)
8、查询课程编号“2”的成绩比课程编号“1”课程低的所有同学的学号、姓名;
(3号-张三)
9、查询所有课程有成绩小于60分的同学的学号、姓名;
(1号、3号、5号、6号 除了2号和4号)
10、查询没有学全所有课的同学的学号、姓名; (4号、5号、6号)
11、查询至少有一门课与学号为“1”的同学所学相同的同学的学号和姓名; (All)
12、查询跟学号为“1”的同学学的所有课一样的其他同学学号和姓名; (2号和3号)
13、把“sc”表中“叶平”老师教的课的成绩都更改为此课程的平均成绩; (61.4)
14、删除学习“叶平”老师课的SC表记录;
15、向sc表中插入一条记录,要求符合以下条件:没有上过编号“3”课程的同学学号、2号课的平均成绩;(6号童鞋没有上过3号课程)
16、按平均成绩从高到低显示所有学生的“语文”、“数学”、“英语”三门的课程成绩,按如下形式显示: 学生ID,语文,数学,英语,有效课程数,有效平均分(待更正 语句有错)
17、查询各科成绩最高和最低的分:以如下形式显示:课程ID,最高分,最低分
18、按各科平均成绩从低到高和及格率的百分数从高到低顺序
19、查询如下课程平均成绩和及格率的百分数(用"1行"显示):
语文-1、数学-2、英语-3、物理-4
20、查询不同老师所教不同课程平均分从高到低显示
21、统计打印各科成绩,各分数段人数:课程ID,课程名称,[100-85],[85-70],[70-60],[ <60]
22、查询学生平均成绩及其名次
23、查询各科成绩前三名的记录:(不考虑成绩并列情况)---------SQL不识别TOP
24、查询每门课程被选修的学生数
25、查询出只选修了一门课程的全部学生的学号和姓名
26、查询男生、女生人数
27、查询姓“张”的学生名单
28、查询同名同姓学生名单,并统计同名人数
29、查询平均成绩大于85的所有学生的学号、姓名和平均成绩
30、查询“物理”课分数不及格的学生姓名和分数
31、查询所有学生的选课情况;
32、查询课程的成绩在80分以上的学生姓名、课程名称和分数;
33、查询选修“周磊”老师所授课程的学生中,成绩最高的学生姓名及其成绩(李四-93)
34、查询不同课程成绩相同的学生的学号、课程号、学生成绩
35、查询两门以上课程大于80分的同学的学号及其平均成绩
36、检索“4”课程分数小于60,按分数降序排列的同学学号
⑤ 3道题目SQL怎么做大家帮帮我
4)
insert into Employees(EmployeeID, Name, Birthday, Sex, Address, Zip, PhoneNumber, EmailAddress, DepartmentID) values ('210678', '林涛', '1973-5-1', '1', '中山北路3号', '210002', '4055663', NULL, '5')
5)
update Employees set Birthday='1967-4-2' where Name = '林涛'
6)--存储过程
create procere insertEmployees
@Employeeid varchar(20),@Name varchar(20),@Birthday datetime,@Sex char(1),
@Address varchar(300),@Zip varchar(6),@PhoneNumber varchar(20),
@EmailAddress varchar(50),@DepartmentID varchar(30)
as
begin
insert into Employees
(EmployeeID, Name, Birthday, Sex, Address, Zip, PhoneNumber,
EmailAddress, DepartmentID)
values(@EmployeeID, @Name,@Birthday, @Sex, @Address, @Zip, @PhoneNumber,
@EmailAddress, @DepartmentID)
end
--调用存储过程
exec insertEmployees '308759',' 叶凡', '1968-1-1','1', '北京西路3号',
'210001', '33089056', NULL, '4'
⑥ sql经典50题
一、查询课程编号为“01”的课程比“02”的课程成绩高的所有学生的学号(重点)
一刷:
excel思路:
观察原始表格数据,在excel中想得到01比02高,我们需要将原始表格拆分成两个表,课程01表和课程02表,再进行vlookup得到c表,根据if条件判断筛出最终数据。
重点是:1.拆表 2.匹配
转成SQL语言:
1.拆表语言:
2.关联加匹配语言 :
3.完整语言:
----到这里其实就可以结束了;
4.若想加student的信息,则需要以上所有结果再作为c表再关联匹配:
若想让字段1和2为上下结果,即重复前面的信息,则语言如下:
二刷:
扩展一:查询成绩小于60分的学生的学号和姓名
1、先反向找出大于等于60分的学号 :
2、匹配:
扩展二:查询平均成绩小于60分的学生的学号、姓名和平均成绩
第一种
1、先找出小于60分和空的作为c表:
2、匹配:
三、查询所有学生的学号、姓名、选课数、总成绩(不重要)
四、查询姓“李”的老师的个数(不重要)
五、查询没学过“张三”老师课的学生的学号、姓名(重点)
六、查询学过“张三”老师所教的所有课的同学的学号、姓名(重点)
七、查询学过编号为“01”的课程并且也学过编号为“02”的课程的学生的学号、姓名(重点)
八、查询课程编号为“02”的总成绩(不重点)
九、查询成绩小于60分的学生的学号和姓名(同题目二)
十、查询没有学全所有课的学生的学号、姓名(重点)
十一、查询至少有一门课与学号为“01”的学生所学课程相同的学生的学号和姓名(重点)
十二、查询和“01”号同学所学课程完全相同的其他同学的学号(重点)
十五、查询两门及其以上不及格课程的同学的学号,姓名及其平均成绩(重点)
十六、检索"01"课程分数小于60,按分数降序排列的学生信息(和34题重复,不重点
十七、按平均成绩从高到低显示所有学生的所有课程的成绩以及平均成绩(重重点与35一样)
十八、查询各科成绩最高分、最低分和平均分:以如下形式显示:课程ID,课程name,最高分,最低分,平均分,及格率,中等率,优良率,优秀率
-- 及格为>=60,中等为:70-80,优良为:80-90,优秀为:>=90 (超级重点)
十九、按各科成绩进行排序,并显示排名
二十、查询学生的总成绩并进行排名(不重点)
二十一、查询不同老师所教不同课程平均分从高到低显示(不重点)
二十二、查询所有课程的成绩第2名到第3名的学生信息及该课程成绩(重要 25类似
二十三、 使用分段[100-85],[85-70],[70-60],[<60]来统计各科成绩,分别统计各分数段人数:课程ID和课程名称(重点和18题类似)
二十四、查询学生平均成绩及其名次(同19题,重点)
二十五、查询各科成绩前三名的记录(不考虑成绩并列情况)(重点 与22题类似)
二十六、查询每门课程被选修的学生数(不重点)
二十七、查询出只有两门课程的全部学生的学号和姓名(不重点)
二十八、查询男生、女生人数(不重点)
二十九、查询名字中含有"风"字的学生信息(不重点)
三十一、 查询1990年出生的学生名单(重点year)
三十二、查询平均成绩大于等于85的所有学生的学号、姓名和平均成绩(不重要)
三十三、查询每门课程的平均成绩,结果按平均成绩升序排序,平均成绩相同时,按课程号降序排列(不重要)
三十四、查询课程名称为"数学",且分数低于60的学生姓名和分数(不重点)
三十五、查询所有学生的课程及分数情况(重点)
三十六、 查询任何一门课程成绩在70分以上的姓名、课程名称和分数(重点)
三十七、 查询不及格的课程并按课程号从大到小排列(不重点)
三十八、 查询课程编号为03且课程成绩在80分以上的学生的学号和姓名(不重要)
三十九、求每门课程的学生人数(不重要)
四十、查询选修“张三”老师所授课程的学生中成绩最高的学生姓名及其成绩(重要top)
四十一、查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩 (重点)
四十二、查询每门功课成绩最好的前两名(同22和25题)
四十三、统计每门课程的学生选修人数(超过5人的课程才统计)。要求输出课程号和选修人数,查询结果按人数降序排列,若人数相同,按课程号升序排列(不重要)
四十四、检索至少选修两门课程的学生学号(不重要)
四十五、查询选修了全部课程的学生信息(重点划红线地方)
四十六、查询各学生的年龄(精确到月份)
四十七、 查询没学过“张三”老师讲授的任一门课程的学生姓名(还可以,自己写的,答案中没有)
四十八、 查询两门以上不及格课程的同学的学号及其平均成绩
四十九、查询本月过生日的学生(无法使用week、date(now())
五十、 查询下月过生日的学生
⑦ 牛客网如何设置题目数量
具体操作步骤如下:
1、在app的主页中选择添加一套试题,随后拉动主页面到达最底部,在最底部中选择自定义刷题。
2、在自定义刷题设置栏中可以设置每次的做题数量和做题的模式,背题模式是每次写完一道题就出题目解析的模式,在选择完每组题目的数量后,新开启的题目就每次都能以所设置的数量来做题了。