iT邦幫忙

28

學外語尚且知道要跟外國人練習會話; 學程式語言,怎能沒有練功平台?心原一馬盤點六個刷題網站

大家好,今天心原一馬要來為大家盤點六個適合練功的OJ。

如果你還沒學過程式,只是想找個適合自學的資源剛好路過,
建議可以先看我的【python超入門】系列的課程(可在我的文章列表中找到)。

如果你是初學程式想找練習平台,
建議可以先看這篇心原一馬從零帶你認識線上解題系統- 專為新手設計的OJ 初體驗
這是小馬為新手而寫的OJ介紹,
因為說實在的,
除了第一個介紹的「高中生程式解題系統」之外,
小馬覺得目前大部分可供練習的OJ網站對新手來說都有點偏難,容易挫折~

以下平台小馬認為各具特色,可依個人喜好及需求選擇練習:
(NOTE: 不論哪個平台,都不建議從第一題開始按照順序做。
因為有時題目難度落差很大,亦或會碰到特別領域的問題會卡住。
建議可以找想練習的類別,或找有興趣的題目標題來做。)

1.適合新手- 高中生程式解題系統

網站名: 高中生程式解題系統(zerojudge)
語言: 中文
入門難易度: ★
題目趣味性: ★★★
網址: https://zerojudge.tw/
是否需另外註冊帳號: 否,可直接用google帳號登入。
【適合族群】: 初學程式、對程式基礎語法有初步認識者。
【平台特色】: 當完成zerojudge上30%的題目時,可成為出題者
【可用解題語言】: C, C++, java, pascal, python
【簡介】:
這個網站是專為新手設計的平台,
網頁標榜說它是「適合所有中學生及初學者的OJ系統」,
進入網頁後,你會看到這樣的頁面:

https://ithelp.ithome.com.tw/upload/images/20190715/20117114HwBbR7yfwv.png

初次使用建議看一下網站上的「使用手冊」,
它有詳細的教學如何讀測資。
按下「分類題庫」按鈕後可以看到各式題庫,如下圖:

https://ithelp.ithome.com.tw/upload/images/20190715/20117114oORaaJ3VMV.png

建議初學者從「基礎題庫」開始。
若選其它題庫則偏競賽的難度了,
適合老鳥挑戰。

雖說基礎題庫的難易度大部分適合入門,
但缺點是基礎題庫難易度落差有點大,部分題目不太適合新手,
實際練習時還是可以斟酌題目難度是否適合自己。

2.多元而由淺入深的教程- HackerRank

網站名: HackRank
語言: 英文(極少數題目中文)
入門難易度: ★
題目趣味性: ★★★
網址: https://www.hackerrank.com/
是否需另外註冊帳號: 否,可直接用google帳號登入。
【適合族群】: 初學程式者且不排斥看英文者、接觸特定專業領域想練習者。
【平台特色】: 具有各式各樣不同的教學課程
【可用解題語言】: C, C++, C#, java, python,ruby, js, php, ... (幾乎主流語言都有)
【簡介】:
登入之後,可以在practice標籤中看到各式各樣的題型,
首先會看到Your skill欄位,會看到自己各個類別解了多少問題,

https://ithelp.ithome.com.tw/upload/images/20190801/20117114DJBxBWGd8D.png

還有不同領域題型分門別類,
甚至有針對單一個語言的訓練:
(建議新手就從左方Problem Solving的Algorithm題庫做起)

https://ithelp.ithome.com.tw/upload/images/20190801/20117114K9c5vrI2vY.png

拉到網頁最下方,亦可以看到有各種教程:
https://ithelp.ithome.com.tw/upload/images/20190801/201171148XSXLAffnN.png

隨著解題數的增加,也可以拿到對應的勳章,
如下:
https://ithelp.ithome.com.tw/upload/images/20190801/2011711409PHoPq1VZ.png

小馬覺得這是個由淺入深,
有各種不同的程式類型分門別類,
且有討論區參考別人的解法的好網站。
唯獨需注意有些專業領域的題目,
若不了解那一塊的話可能真的讓人沒有頭緒,
可選擇自己想鑽研的領域來做。

3.階梯訓練,碼力測試- LintCode

網站名: LintCode
語言: 可選中文/英文
入門難易度: ★★
題目趣味性: ★★
網址: https://www.lintcode.com/
是否需另外註冊帳號: 否,可直接用google帳號登入。
【適合族群】: 正在學程式找練習平台; 找工程師工作面試前練功
【平台特色】: 方便找題目訓練的階梯訓練、碼力測試
【可用解題語言】: C++, java, python, js, Go
【簡介】:
登入後便可以看到題目集,可從中篩選自己想做的難度與題型:

https://ithelp.ithome.com.tw/upload/images/20190801/20117114ZH8C4P9Fe9.png

這邊介紹兩個平台特色: 階梯訓練碼力測試

一般進入OJ解題都會面臨這個問題:
「哇~ 平台上有一千多道題目耶,該從哪一道題開始練習呢?」,
LintCode上的階梯訓練很好的解決的這個問題,
當你選擇一項寫有「公開訓練」的「階梯訓練」,
就會出現一道道的關卡,

https://ithelp.ithome.com.tw/upload/images/20190801/20117114OFqFuHM8Tx.png

https://ithelp.ithome.com.tw/upload/images/20190801/20117114S43VE3xAx4.png

你必須先把第一關的題目全部解鎖後,
才可以解鎖後面的關卡,
猶如玩遊戲破關一樣。
並且,性質類似或難易度較接近的問題,
也常會放在同一關中,
從而達到有系統的訓練。

第二個特色應該就是「碼力訓練」了,
在上方標籤點選CAT
是(Coding Ability Test)的縮寫,
點進去後真的可以看到一隻可愛的貓。

https://ithelp.ithome.com.tw/upload/images/20190801/20117114RywejKU8eM.png

小馬自己嘗試闖關目前達青銅 IV
CAT總共有青銅、白銀、黃金、鉑金、鑽石五個等級,
每個等級各自有四個小階級,
透過在時限內完成程式挑戰可以提升等級,
簡直就像玩遊戲打怪練等一樣啊。
另外,很有趣的,在CAT中還有一張CAT段位說明表:

https://ithelp.ithome.com.tw/upload/images/20190801/20117114KL4AbZtcUR.png
https://ithelp.ithome.com.tw/upload/images/20190801/20117114EN4PgrY1GJ.png

根據該網站介紹,
CAT不只是在玩耍而已哦。
據說達到鉑金段位時,其實你也有進知名大公司的實力了,
你是否也躍躍欲試呢?

4.工程師準備面試的刷題網站- LeetCode

網站名: LintCode
語言: 英文
入門難易度: ★★★
題目趣味性: ★★
網址: https://leetcode.com/
是否需另外註冊帳號: 否,可直接用google帳號登入。
【適合族群】: 據說準備軟體工程師面試非常多人使用的平台
【平台特色】: 每週日早上的線上競賽
【可用解題語言】: C, C++, C#, java, python,ruby, js, php, ... (幾乎主流語言都有)
【簡介】:
如果你LintCode和LeetCode兩個平台都做過的話,
會發現兩個平台的題目似乎重疊性頗高的,
但是LeetCode有勝於LintCode之處,

  1. 測資較嚴謹,有時候在LintCode能通過的程式在LeetCode上不一定能通過。
  2. 相較於LintCode,LeetCode支援的程式語言較多
  3. 較完整的討論區,卡關時可以參考別人的解答

但基於上述所說的LintCode有階梯訓練CAT兩大特色,
小馬LintCode, LeetCode兩個平台都會去練習。

這邊介紹LeetCode特色 - 週日早上的線上競賽,
它是90分鐘之間有四道題目,
目標為愈短時間內完成愈多題。

登入後,在LeetCode主頁上方會看到Contest標籤:

https://ithelp.ithome.com.tw/upload/images/20190801/20117114hc7L2NTMfp.png

點選後,可以看到大大的黃框寫著Weekly Contest 148
(表示直到小馬撰文的這個時間點,此競賽已辦了147週之久)

https://ithelp.ithome.com.tw/upload/images/20190801/20117114978Tl6eY7P.png

點進去後,按下綠色的register按鈕並確認以完成報名:
https://ithelp.ithome.com.tw/upload/images/20190801/20117114eMCaDlrfrN.png

每週完賽後,所有參賽者AC(通過題目)的code都是公開的,
你可以在排行榜看前幾名大神都是如何寫code的,
亦可以在千人中看到自己的排名,
若每週完賽都確實的學會每一道題,實力一定大有成長。
(注意: 此競賽難度偏高,若新手參加發現一題都答不出來屬正常現象。)

5.經典的OJ - UVa

網站名: UVa
語言: 英文
入門難易度: ★★★★★★
題目趣味性: ★★
網址: https://onlinejudge.org/
是否需另外註冊帳號: 是。
【適合族群】: 程式高手欲更上一層樓者
【平台特色】: 歷史悠久,上千題經典問題
【可用解題語言】: C, C++, java, pascal, python
【簡介】:
關於UVa平台如何使用,在別人的這篇文章中已有詳細介紹,
小馬不再贅述。
UVa歷史較久,
早在1995年並非人人都有一台電腦時即創立,
目前有五千題左右的題目。
但是你們可能注意到,
為何小馬在入門難易度主觀評價為驚人的★★★★★★呢?
LeetCode是準備工程師面試的常用網站,
要能夠幫業界公司工作的工程師耶,
可想而知問題具有一定的鑑別度,
這樣的OJ小馬尚且主觀認為入門難易度為★★★,
莫非UVa的問題真的難如登天,
跨躍★★★★和★★★★★直接來到★★★★★★嗎?

這個感覺不光是題目難度造成的,
相較於其它OJ,如HackRank, LintCode, LeetCode…等,
都是只需要完成題目描述的函數即可,
可以專注於實作演算法,
而無需自己手動做輸入輸出的工作。
並且在HackRank, LintCode, LeetCode上都有Run Test
可以檢測自己是否通過範例測資。
但是在UVa上並沒有Run Test
完成程式上繳後只會得到這個答案是對或錯。

一旦是錯的要找出自己錯在哪個環節可是非常有挑戰性的,
像是說是讀測資有問題呢?
還是算法有誤?
還是其實答案對了只是輸出格式不對?
這些並無從得知,只能靠很有耐性的不斷測試,
並非說這個網站不好,
若是能夠攻略UVa,自己解決問題的能力一定有飛躍性的突破,

並且UVa沒有如LeetCode上的討論區,
若真的對一道題目沒有頭緒,
估計只能再多鑽研個幾天或在網上搜搜看有沒有人有解過分享在網上了。
★★★★和★★★★★不足以表達UVa要上手的難度,
小馬主觀給★★★★★★評價,
對小馬來說,大概是其它OJ已經解到沒什麼挑戰了才會想來嘗試UVa。

6.完善的題目分級 - CodeWars

網站名: Codewars
語言: 英文
入門難易度: ★
題目趣味性: ★★
網址: https://www.codewars.com/
是否需另外註冊帳號: 可用github登入。
【適合族群】: 初學程式或老鳥皆適合
【平台特色】: 題目難度分八個等級、門檻不高可成為出題者
【可用解題語言】: C, C++, C#, java, python,ruby, js, php, ... (幾乎主流語言都有)
【簡介】:
關於如何註冊帳號,別人於這篇文章中有細講,
小馬主要來聊聊CodeWars的特色- 分級制度。
一般OJ上僅有「簡單」、「中等」、「困難」三個等級,
往往無法反映出該題目的難易度,
同為「簡單」題,有的可能讓你一眼就解開了,
可能有的就讓你苦戰一天。

Codewars的題目稱為Kata,細分至八個等級,
並且一道題的難度由參與者共同投票決定,
通常題目分級能很好的反映出題目難易度。
若是不排斥英文的話,
小馬覺得新手要以Codewars 8級的問題做為第一個OJ入門也是OK的。

哦,對了,可別被數字給騙囉,
數字愈小表示等級愈高,
以下是目前的Codewars級數表:

https://ithelp.ithome.com.tw/upload/images/20190801/20117114JqIw8wtZ3e.png

一開始的註冊的帳號為8級,隨著解題數愈多,
等級也會慢慢提高,也會解鎖更多功能。
(帳號等級與可做題目等級無關,你若覺得自己實力足夠也可直接挑戰1級的問題)
像是小馬實測大約到達5級的時候即解鎖出題功能
若你想試試出題的樂趣,
則在Codewars的門檻不高可以一試。
(小馬原本還以為是不是至少帳號要練到1段才能解鎖出題功能 ( ̄▽ ̄)~*,
相較於「高中生解題系統」要解完全平台30%的題目才能出題,
Codewars的門檻真的佛~)

另外還有一大特色,
Codewars可以選擇自己想練習的語言,
當自己解開問題時,
便可以看到其它人跟自己同語言的解答,
因為最佳解法是參與者共同票選出來的,
通常看到的解答都是品質高的,看了很有收穫。

小馬認為這樣的機制很好的解決其它OJ(如: LeetCode)討論區語言太雜的問題。
因為一般OJ支援眾多程式語言,
假設你是Ruby使用者(相對較少人用的語言),
可能在討論區中看到什麼python一行解啦,
js解法啦,
c++解法啦,
不一定能順利找到自己語言的解法。

可是在Codewars選擇自己想訓練的程式語言後,
解答區清一色全是系統統整出跟自己相同語言的解法,
可以很好的學習到別人的code。

或許拜出題不高的門檻所賜,
目前Codewars上的總題數近八千多題,
甚至超越了經典OJ- UVa的題數。
做為學習,Codewars是個非常優質的網站,
但也由於海量的題目,
可能不容易快速進入到演算法的精華問題,
若是工程師求職前練習可能還是LeetCode為佳。


1 則留言

1
to790303
iT邦新手 5 級 ‧ 2019-08-05 18:21:12

謝謝一馬大的分享,目前正看著您的python文章跟著學習,希望能在年底前更加精進自己的能力,蠻後悔大學時期沒有認真學習XD (去年剛畢業),現在努力學習中,期望之後有python問題可以與您交流

心原一馬 iT邦研究生 5 級 ‧ 2019-08-06 01:21:34 檢舉

哈哈~ 歡迎哦,加油加油~ 只要願意開始學習都不算太晚。歡迎交流,如有問題也歡迎直接在文章底下留言發問哦。

我要留言

立即登入留言