Tarkibga o'tish

2. Map — xaritalar

map[K]V — kalit-qiymat juftliklari to'plami. Barcha masalalarda map'ni aylanib chiqish tartibi kafolatlanmaganini yodda tuting; tartib kerak bo'lsa, kalitlarni saralang.

Asosiy amallar

1. Talabalar ismi va bahosini saqlovchi map[string]int yarating. Yangi talaba qo'shing, bahoni yangilang, talabani o'chiring (delete) va barcha yozuvlarni chiqaring.
Misol: Ali: 85 qo'shilgan, Ali bahosi 90 ga yangilangan, Vali o'chirilgan → map[Ali:90]

2. Map'dan kalit bo'yicha qiymat oling. Kalit mavjud bo'lmaganda nima qaytishini ko'rsating va «vergul-ok» (v, ok := m[k]) usuli bilan mavjudlikni tekshiring.
Misol: m := map[string]int{"a": 1}: m["x"] → 0; v, ok := m["x"] → 0 false; v, ok := m["a"] → 1 true

3. nil map'dan o'qish va unga yozishga urinib ko'ring. Qaysi amal panic berishini ko'rsating va to'g'ri ishga tushirish usullarini (make, literal) yozing.
Misol: var m map[string]int: m["a"] → 0 (o'qish xavfsiz); m["a"] = 1 → panic: assignment to entry in nil map

4. Map'ni kalitlari bo'yicha alifbo tartibida chiqaring (maps.Keys va slices.Sorted yoki kalitlarni slice'ga yig'ib saralash orqali).
Misol: {"b": 2, "a": 1, "c": 3} → a: 1, b: 2, c: 3

5. Map'ni qiymatlari bo'yicha kamayish tartibida chiqaring; qiymatlar teng bo'lsa — kalit bo'yicha.
Misol: {"a": 2, "b": 3, "c": 3, "d": 1} → b: 3, c: 3, a: 2, d: 1

Sanash va guruhlash

6. Matn berilgan. Har bir so'zning necha marta uchrashini sanang (katta-kichik harf farqlanmaydi, tinish belgilari olib tashlanadi) va eng ko'p uchragan 5 ta so'zni chiqaring.
Misol: "Salom dunyo! Salom Go, salom." → salom: 3, dunyo: 1, go: 1

7. Satr berilgan. Undagi har bir belgi (rune) ning chastotasini sanang. Ko'p baytli belgilar (masalan «ş», «ç», «ё» yoki emoji) bitta belgi sifatida sanalishini tekshiring va len(s) bilan utf8.RuneCountInString(s) farqini ko'rsating.
Misol: "ёж" → len(s) = 4, utf8.RuneCountInString(s) = 2, har bir belgi 1 marta; "😀" → len = 4, belgilar 1 ta

8. So'zlar ro'yxati berilgan. Anagrammalarni guruhlang: ["ota", "ato", "toa", "non", "onn"] → [[ota ato toa] [non onn]].
Misol: ["ota", "ato", "toa", "non", "onn"] → [[ota ato toa] [non onn]]

9. Talabalar (ism, guruh) ro'yxati berilgan. map[string][]string yordamida talabalarni guruhlar bo'yicha guruhlang va har bir guruhni alohida chiqaring.
Misol: (Ali, G1), (Vali, G2), (Sevara, G1) → G1: [Ali Sevara], G2: [Vali]

10. Butun sonlar slice'i va K soni berilgan. Map yordamida yig'indisi K ga teng bo'lgan ikki element indekslarini O(N) vaqtda toping.
Misol: [2 7 11 15], K = 9 → indekslar 0 1

To'plam sifatida map

11. map[T]struct{} asosida Set turini yarating: Add, Remove, Has, Len va elementlarni saralangan ko'rinishda qaytaruvchi Items metodlari bilan.
Misol: Add(3), Add(1), Add(3), Has(1) → true, Len() → 2, Items() → [1 3], Remove(1) dan keyin Len() → 1

12. Ikki Set ning birlashmasi, kesishmasi va ayirmasini qaytaruvchi funksiyalar yozing.
Misol: {1 2 3} va {2 3 4} → birlashma {1 2 3 4}, kesishma {2 3}, ayirma (A − B) {1}

13. Slice'dan takrorlanuvchi elementlarni olib tashlang, birinchi uchrash tartibi saqlansin (map yordamida).
Misol: [3 1 3 2 1] → [3 1 2]

14. Ikki slice berilgan. Ular bir xil elementlardan (takrorlanishlar sonini hisobga olgan holda) iboratligini map yordamida tekshiring.
Misol: [1 2 2 3] va [3 2 1 2] → true; [1 2 2] va [1 1 2] → false

Murakkab kalit va qiymatlar

15. Tekislikdagi nuqtalarni struct{X, Y int} kalitli map'da saqlang. Berilgan nuqtalar ro'yxatida takrorlanuvchi nuqtalarni toping.
Misol: (1, 2), (3, 4), (1, 2) → takrorlanuvchi nuqta {1 2}

16. Ikki o'lchamli ichma-ich map (map[string]map[string]int) da shaharlar orasidagi masofalarni saqlang. Ichki map mavjud bo'lmaganda uni avtomatik yaratib qiymat qo'shuvchi Set(a, b, d) funksiyasini yozing.
Misol: Set("Toshkent", "Samarqand", 300) → map[Toshkent:map[Samarqand:300]]

17. map[string]*Student va map[string]Student ni solishtiring: har ikkisida talaba bahosini o'zgartirishga urinib ko'ring. Nega ikkinchi holatda m[k].Grade = 5 kompilyatsiya xatosi berishini izohlang.
Misol: map[string]*Student da m["ali"].Grade = 5 ishlaydi; map[string]Student da bu qator kompilyatsiya xatosi beradi

18. Map'ni funksiyaga uzatib, uning ichida element qo'shing. Chaqiruvchi tomonda o'zgarish ko'rinishini ko'rsating va nega shunday bo'lishini (map — ma'lumotnoma turi) izohlang.
Misol: funksiyaga uzatishdan oldin len(m) = 1, funksiya element qo'shgandan keyin chaqiruvchida len(m) = 2

19. Map'ni aylanib chiqish jarayonida elementlarni o'chirish mumkinligini, lekin qo'shilgan elementlar aylanishda ko'rinishi kafolatlanmasligini tajriba bilan ko'rsating.
Misol: {1: a, 2: b, 3: c} ni aylanib, har bir kalitni o'chirish → xatosiz tugaydi, oxirida len(m) = 0; aylanish paytida qo'shilgan elementlar ko'rinishi kafolatlanmaydi

Amaliy masalalar

20. Oddiy telefon kitobchasi: buyruqlar oqimi (add ism raqam, del ism, get ism, list) ni qayta ishlovchi dastur yozing.
Misol: add Ali 901112233, add Vali 902223344, get Ali → 901112233, del Ali, get Ali → topilmadi, list → Vali 902223344

21. Memoizatsiya: Fibonachchi sonlarini map[int]uint64 kesh yordamida hisoblovchi funksiya yozing va keshsiz variant bilan tezlikni solishtiring.
Misol: fib(50) → 12586269025; fib(90) → 2880067194370816120

22. Graf qo'shnilik ro'yxati map[string][]string ko'rinishida berilgan. Berilgan uchdan kenglik bo'yicha qidiruv (BFS) bilan barcha yetib boriladigan uchlarni toping.
Misol: {A: [B C], B: [D], C: [D], D: []}, boshlang'ich uch A → A B C D

23. Ikki map'ni birlashtiruvchi funksiya yozing: kalit ikkalasida bo'lsa, qiymatlar berilgan funksiya (func(a, b int) int) yordamida birlashtirilsin.
Misol: {"a": 1, "b": 2} va {"b": 3, "c": 4}, birlashtirish funksiyasi a + b → map[a:1 b:5 c:4]

24. Map'ni teskari aylantiring (qiymat → kalitlar ro'yxati): map[string]int → map[int][]string, ro'yxatlar saralangan bo'lsin.
Misol: {"a": 1, "b": 2, "c": 1} → map[1:[a c] 2:[b]]

25. LRU kesh'ni map va container/list yordamida amalga oshiring: Get va Put amallari O(1) vaqtda ishlasin.
Misol: sig'im 2: Put(1, "A"), Put(2, "B"), Get(1) → A, Put(3, "C") (2 chiqariladi), Get(2) → topilmadi