Amaliyot
Nazariyani o’qib chiqish yetarli emas - algoritmlarni faqat masala yechib o’zlashtirasiz. Yaxshi xabar: buning uchun tekin, sifatli manbalar bor va Go ularda to’liq qo’llab-quvvatlanadi.
Qayerda mashq qilish
- LeetCode - eng katta masalalar bazasi. “Easy” dan boshlang, til sifatida Go ni tanlang.
- NeetCode - LeetCode masalalarini mavzu bo’yicha tartiblab, video yechimlar bilan beradi. Yangi boshlovchi uchun eng qulay yo’l xaritasi.
- Exercism (Go track) - mentorlar kod-revyu qiladi, Go idiomalariga o’rgatadi.
- Project Euler - matematik-algoritmik masalalar.
Maslahat: har kuni 1-2 masala, uzoq muddat. Bir kunda 20 ta yechishdan ko’ra, muntazamlik foydali.
Naqsh: two pointers
Ko’p masala “ikki ko’rsatkich” naqshi bilan yechiladi - massivni ikki tomondan siqib kelasiz. Tartiblangan slice da yig’indisi target bo’lgan juftlikni topaylik:
package main
import "fmt"
func twoSum(a []int, target int) (int, int) {
lo, hi := 0, len(a)-1
for lo < hi {
sum := a[lo] + a[hi]
switch {
case sum == target:
return a[lo], a[hi]
case sum < target:
lo++ // kichik tomonni kattalashtiramiz
default:
hi-- // katta tomonni kichraytiramiz
}
}
return -1, -1
}
func main() {
a := []int{1, 3, 4, 6, 8, 11}
x, y := twoSum(a, 10)
fmt.Println(x, "+", y, "=", 10) // 4 + 6
}$ go run twosum.go
4 + 6 = 10Naqsh: sliding window
Ketma-ket bo’lakni “oyna” kabi surib, qayta hisoblamasdan natijani yangilaysiz. k uzunlikdagi eng katta yig’indili bo’lakni topaylik:
package main
import "fmt"
func maxSubarraySum(a []int, k int) int {
sum := 0
for i := 0; i < k; i++ { // birinchi oyna
sum += a[i]
}
best := sum
for i := k; i < len(a); i++ {
sum += a[i] - a[i-k] // yangi kirdi, eski chiqdi
best = max(best, sum)
}
return best
}
func main() {
fmt.Println(maxSubarraySum([]int{2, 1, 5, 1, 3, 2}, 3)) // 9 (5+1+3)
}$ go run window.go
9Har ikki naqsh O(n) - ichma-ich siklsiz. Ko’p LeetCode masalasi shu ikki g’oya atrofida aylanadi.
Xulosa: Muntazam mashq + naqshlarni tanish = algoritmik intervyu va real ish uchun tayyorlik.
Manba / batafsil: NeetCode Roadmap