① 想刷題,看這份私藏了多年的刷題網站就行了
遙想當年,機緣巧合入了 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、在自定義刷題設置欄中可以設置每次的做題數量和做題的模式,背題模式是每次寫完一道題就出題目解析的模式,在選擇完每組題目的數量後,新開啟的題目就每次都能以所設置的數量來做題了。