目錄1 本章預覽2 簡單題舉例2.1 題目描述2.2 題目解析2.3 題解2.4 涉及基礎語法3 中等題舉例3.1 題目描述3.2 題目解析3.3 題解3.4 涉及基礎語法4 本章小結 1 本章預覽 事實上本章並不會去講述go語言的基礎情況,而是去介紹如何使用Leetcode去幫助我們去學習go語言 ...
目錄
1 本章預覽
事實上本章並不會去講述go語言的基礎情況,而是去介紹如何使用Leetcode去幫助我們去學習go語言的基本語法,當然本章的內容也適合於其他語言。
Leetcode是一個很好的線上判題系統(Online Judge,OJ),它幾乎支持所有主流語言的學習,例如C/C++,Java,Python, Go, JavaScript等等。
使用Leetcode學習編程語言有以下好處:
- 提供實時反饋:線上判題系統可以立即對提交的程式進行編譯和執行,並返回結果,這有助於學習者及時瞭解自己的代碼是否正確,以及程式的運行時間和記憶體使用情況。
- 自動評測:線上判題系統可以自動判斷程式的正確性,這使得學習者可以專註於編寫代碼的邏輯,而不必擔心測試和調試的問題。
- 適合初學者:對於初學者來說,線上判題系統提供了一個安全、可靠的環境,讓他們可以自由地嘗試和練習編程,不用擔心會破壞或影響其他程式。
- 自我挑戰:線上判題系統通常會有一些難度不一的題目,學習者可以通過解決這些問題來提高自己的編程技能和解決問題的能力。
- 社區支持:線上判題系統通常有一個社區功能,學習者可以在這裡與其他人交流、分享代碼和經驗,這有助於提高學習者的編程技能和編程興趣。
總之,使用線上判題系統學習編程語言可以幫助學習者提高編程技能、解決問題能力和編程興趣。
2 簡單題舉例
2.1 題目描述
羅馬數字包含以下七種字元: I
, V
, X
, L
,C
,D
和 M
。
字元 數值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 羅馬數字 2
寫做 II
,即為兩個併列的 1 。12
寫做 XII
,即為 X
+ II
。 27
寫做 XXVII
, 即為 XX
+ V
+ II
。
通常情況下,羅馬數字中小的數字在大的數字的右邊。但也存在特例,例如 4 不寫做 IIII
,而是 IV
。數字 1 在數字 5 的左邊,所表示的數等於大數 5 減小數 1 得到的數值 4 。同樣地,數字 9 表示為 IX
。這個特殊的規則只適用於以下六種情況:
I
可以放在V
(5) 和X
(10) 的左邊,來表示 4 和 9。X
可以放在L
(50) 和C
(100) 的左邊,來表示 40 和 90。C
可以放在D
(500) 和M
(1000) 的左邊,來表示 400 和 900。
給定一個羅馬數字,將其轉換成整數。
2.2 題目解析
學習完go語言的基礎部分,事實上我們有多種方法去解題,為了存儲羅馬數字和阿拉伯數字的關係我們使用數據類型map,,轉化成阿拉伯數字相加,然後我們發現遍歷當前的值比當前右邊的值小時要減當前值,反之加上當前值,例如IV,第1個I要減1,第2個V要加5。
看解決簡單題事實上很簡單,1.決定關鍵數據存儲類型 2.決定程式的演算法。為此事實上程式就是數據結構加上演算法。
2.3 題解
var riMap = map[byte]int{
'I': 1,
'V': 5,
'X': 10,
'L': 50,
'C': 100,
'D': 500,
'M': 1000,
}
func romanToInt(s string) int {
ans := 0
i := 0
for i = 0; i < len(s)-1; i++ {
if riMap[s[i]] < riMap[s[i+1]] {
ans -= riMap[s[i]]
} else {
ans += riMap[s[i]]
}
}
ans += riMap[s[i]]
return ans
}
2.4 涉及基礎語法
函數,分支選擇結構,迴圈結構,字元串,
3 中等題舉例
3.1 題目描述
請你來實現一個 myAtoi(string s)
函數,使其能將字元串轉換成一個 32 位有符號整數(類似 C/C++ 中的 atoi
函數)。
函數 myAtoi(string s)
的演算法如下:
- 讀入字元串並丟棄無用的前導空格
- 檢查下一個字元(假設還未到字元末尾)為正還是負號,讀取該字元(如果有)。 確定最終結果是負數還是正數。 如果兩者都不存在,則假定結果為正。
- 讀入下一個字元,直到到達下一個非數字字元或到達輸入的結尾。字元串的其餘部分將被忽略。
- 將前面步驟讀入的這些數字轉換為整數(即,"123" -> 123, "0032" -> 32)。如果沒有讀入數字,則整數為
0
。必要時更改符號(從步驟 2 開始)。 - 如果整數數超過 32 位有符號整數範圍
[−2^31, 2^31 − 1]
,需要截斷這個整數,使其保持在這個範圍內。具體來說,小於−2^31
的整數應該被固定為−2^31
,大於2^31 − 1
的整數應該被固定為2^31 − 1
。 - 返回整數作為最終結果。
註意:
- 本題中的空白字元只包括空格字元
' '
。 - 除前導空格或數字後的其餘字元串外,請勿忽略 任何其他字元。
3.2 題目解析
一個整數我們可以分成2個部分:1. 符號字元(或者沒有) +/- 2.數字字元,我們先判斷是否存在正負號,然後讀取數字字元,按位相加,同時看看是否超過限制就能達到我們的目的
3.3 題解
func myAtoi(s string) int {
ans := 0
sign := 0
for i := range s {
switch {
case s[i] == ' ' && sign == 0: //當前空格,並且之前還未出現符號
case s[i] == '+' && sign == 0: //當前+,並且之前未出現符號
sign = 1
case s[i] == '-' && sign == 0: //當前-,並且之前未出現符號
sign = -1
case s[i] <= '9' && s[i] >= '0' && sign == 0: //當前數字字元,並且之前未出現符號
sign = 1
ans = ans*10 + int(s[i]-'0')
case s[i] <= '9' && s[i] >= '0' && sign != 0: //當前數字字元,並且之前出現符號
ans = ans*10 + int(s[i]-'0')
if sign*ans > math.MaxInt32 { //當前數字字元超過最大值截斷
return math.MaxInt32
}
if sign*ans < math.MinInt32 { //當前數字字元小於最大值截斷
return math.MinInt32
}
default: //其他情況
return sign * ans
}
}
return sign * ans
}
3.4 涉及基礎語法
函數,分支選擇結構,迴圈結構,數據範圍(int當前是64位的,這個在第3章分析過leetcode是64位操作系統),字元串
4 本章小結
我們通過簡單題和中等題的解答可以看到使用Leetcode等OJ學習語言的基礎語法會變得很簡單,而且成本很低。語法錯誤,程式正確性均由Leetcode去判定,可以提高我們的邏輯思辨能力和考慮問題的全面性,哪怕是像本次舉例的題目那樣簡單的需求。
你別看我是很簡單地寫出了題解,事實上我在這些題目上面翻過不少車
如本次的中等題