一些簡單的程式設計練習題

jobbole發表於2013-12-11

每當成為入門CS課程(學生們學習程式語言的課程)的助教時,都困於提出好的練習題。Project Euler和類似的問題通常對初學者來說來難了,尤其是對於那些沒有很強數學背景的同學。

在這篇文章中,Adrian Neumann 收集了一些從初級到高階逐級困難的練習題,適合剛開始學習程式設計的初學者。當有新的練習題時,Adrian 會及時新增。除了一些GUI問題外,練習題一般都是演算法題,無需學習任何庫就可以解決。課程練習題的困難程度有時候取決於你使用的程式語言。例如,關於列表List的練習題若用內部不支援List的C語言來解決的話會困難些。

即使有一定程式設計經驗的人想要學習一門新語言的時候,雖然這對他們來說相對簡單,但我認為這還是有用的。

 

初級

1. 寫程式將” Hello World”列印到螢幕。

2. 寫程式輸入使用者的姓名並用該姓名和他打招呼。

3. 修改上一個程式,使得僅可以與Alice和Bob這兩個使用者用其姓名與之打招呼。

4. 寫程式輸入一個數n並列印出從1到n的和。

5. 修改上個程式,使得求和的數只包含3或5的倍數,例如n=17,則求和的數為:3, 5, 6, 9, 10, 12, 15。

6. 寫個程式,要求使用者輸入一個數n,並概率性的選擇是計算1到n的和還是計算1到n的乘積。

7. 寫程式列印出12×12乘法表。

8. 寫程式列印所有的素數。(注意:如果你用的程式語言不支援任意大小的數,那麼列印出所有你能表示的素數,包括最大數)

9. 寫一個競猜遊戲,使用者必須猜一個祕密的數字,在每次猜完後程式會告訴使用者他猜的數是太大了還是太小了,直到猜測正確,最後列印出猜測的次數。如果使用者連續猜測同一個數字則只算一次。

10. 寫個程式列印出接下來的20個閏年。

11. 寫程式計算:
20131209145605

 

列表list和字串

1. 寫一個函式,返回列表中最大的數。

2. 寫函式逆轉列表,最好是原地逆轉。

3. 寫個函式檢查指定的元素是否出現在列表中。

4. 寫個函式返回列表中奇數位置的所有元素。

5. 寫個函式計算列表的執行花費總和(the running total)。

6. 寫個函式測試一個字串是否是迴文。

7. 寫三個函式來計算列表中數字的和:分別用for迴圈,while迴圈和遞迴完成。

8. 寫個函式on_all遍歷列表中的每個元素,列印出開始的20個完全平方數。

9. 寫個函式連線兩個列表。

10. 寫個函式交替合併兩個列表,例如:[a,b,c], [1,2,3][a,1,b,2,c,3]

11. 寫個函式合併兩個有序的列表。

12. 寫個函式計算前100個Fibonacci數的列表。

13. 寫個函式,返回指定數的各位數字的列表。

14. 寫個函式對兩個數進行加減乘,使用各個位上的數字表示的列表實現並返回一個新的數字列表,如果你有信心可以實現Karatsuba乘法。嘗試不同的基數,如果你關心速度可以比較下哪個是最佳基數。

15. 實現下面的排序演算法:選擇排序,插入排序,歸併排序,快速排序,臭皮匠排序(Stooge Sort)。具體的描述見Wikipedia。

16. 實現二分查詢。

17. 寫個函式,給定一個字串列表並按下面表示列印出來,一行一個列印在矩形框中。例如列表[“Hello”, “World”, “in”, “a”, “frame”] 列印的結果是:

18. 寫函式將一段文字text翻譯為Pig Latin返回,英語翻譯為Pig Latin的規則是:取出每個單詞的首個字母,追加’ay’後再放到該單詞的末尾。例如“The quick brown fox” 翻譯後就變成了 “Hetay uickqay rownbay oxfay”。

 

中級

1. 寫程式在1,2,…,9(保持這個順序)之間可任意放+或-或都不放使其結果等於100,輸出所有可能的放法。例如:1 + 2 + 3 – 4 + 5 + 6 + 78 + 9 = 100。

2. 寫程式以一個假想行星的一年持續時間作為輸入,產生一個閏年規則,最大限度的減少與該行星的太陽年的差異。

3. 實現資料結構圖,允許修改(插入,刪除),並能夠儲存邊和節點的值。可能使用(node, edgelist)字典對錶示完成該功能最容易。

4,寫個函式生成圖的DOT表示(譯者注:DOT語言是一種文字圖形描述語言,它提供了一種簡單的描述圖形的方法,並且可以為人類和計算機程式所理解。)。

5. 寫程式自動的給你生成文章:

(1)使用一個樣例文字sample建立有向(多)圖,其中文字單詞作為節點,如果文字中u後面是v則u和v之間有一條有向邊,多次出現生成多條邊。

(2)在該圖中做隨機遍歷:從一個隨機的節點開始選擇一個隨機的後繼節點,如果沒有後繼節點就隨機的選擇另一個節點。

6. 寫程式自動的將英文文字轉換為摩爾斯電碼(譯者注: 摩斯碼(Morse Code)是一種時通時斷的訊號程式碼,通過不同的排列順序來表達不同的英文字母、數字和標點符號)或者相反。

7. 寫程式找出給定字串的最長迴文子串,儘可能高效的實現。

 

高階

1. 給定兩個字串,寫程式高效的找出最長的公共子串。

2. 給定一個整數陣列,寫程式高效的查詢:比位置i處的數稍大的最近鄰數,這裡的距離是指陣列下標的絕對差。例如陣列[1,4,3,2,5,7],比4大的最近的數是5。先用線性時間做預處理,然後用常數時間做查詢。

3. 給定兩個字串,使用字元插入和刪除將其中的一個字串轉變成另一個,輸出最短的插入和刪除序列。

4. 寫個函式實現兩個矩陣相乘。儘可能高效的實現並使用較好的線性代數庫(linear algebra library,具體可看這裡)進行效能比較。你也許想讀一下Strassen’s algorithm和CPU快取的影響,嘗試不同的矩陣佈局,看看發生了什麼。

5. 給定d維矩陣框集合,寫程式計算它們交集的體積,從2維開始逐步計算。

 

GUI

  • 寫一個展示彈跳球的程式。
  • 寫一個記憶體遊戲。
  • 寫一個俄羅斯方塊工程Tetris clone。

 

最後的開放性問題

  1. 寫一個儘可能好玩的猜字遊戲Hangman。例如你可以使用這樣的大字典並選擇排除大部分單詞仍有解決方案的字母。儘可能高效的實現,比如不要每一輪都掃描整個詞典。
  2. 寫個程式與人類玩石頭剪刀布(Rock, Paper, Scissors),嘗試證明人類非常不善於生成隨機數字。
  3. 寫個程式與人類對手玩Battle Ship(海戰棋,是雙人玩的猜謎遊戲),輸入座標並輸出是否擊中及此次射擊的座標。

 

其它收集

當然我不是第一個提出要收集類似上面列表這種思想的人。

相關文章