Məzmuna keçin
  • Kateqoriyalar
  • Ən yeni
  • Teqlər
  • Populyar
Yığmaq
Brend loqosu
codexC

codex

@codex
Haqqında
Yazı
76
Mövzu
64
Paylaşımlar
0
Qruplar
1
İzləyicilər
1
İzləyir
0

Yazı

Ən yeni

  • Stack məlumat strukturu
    codexC codex

    Stack Nədir?

    Stack — elementlərdən ibarət olan bir abstrakt məlumat strukturu və ya verilənlər tipi kimi istifadə olunur. Stack-in əsas xüsusiyyəti ondan ibarətdir ki, elementlər yalnız bir tərəfdən - “üst” (top) hissədən əlavə edilir və çıxarılır. Bu səbəbdən LIFO (Last-In-First-Out - Son Daxil Olan İlk Çıxır) prinsipinə əsaslanır.

    Stack-lər proqramlaşdırmada geniş istifadə olunur və aşağıdakı sahələrdə tətbiq edilir:

    • Funksiya çağırışlarının idarə edilməsi (call stack);
    • Undo/Redo əməliyyatları (məsələn, mətn redaktorlarında geri qaytarma);
    • Brauzer tarixçəsinin idarə edilməsi (routing, tarix obyekti stack kimi işləyir).

    Stack-in JavaScript-də implementasiyası

    Stack üçün əsas class

    Stack-i yaratmaq üçün əvvəlcə Node və Stack class-larını müəyyən etməliyik.

    Node classı:

    • Constructor qəbul etdiyi value parametrini this.value-ə mənimsədir;
    • this.next default olaraq null olur.

    Stack classı:

    • Constructor heç bir parametr qəbul etmir, amma this.first və this.last dəyərləri null olur;
    • this.size dəyişəni isə 0-dır.
    class Node {
      constructor(value) {
        this.value = value;
        this.next = null;
      }
    }
    
    class Stack {
      constructor() {
        this.first = null;
        this.last = null;
        this.size = 0;
      }
    }
    

    Element əlavə etmə (Push) — O(1)

    Stack-ə element əlavə etmək üçün push() metodunu yazırıq.

    Addım-addım izah:

    1. Yeni bir Node yaradırıq və ona dəyər ötürürük.
    2. Əgər stack boşdursa, first və last propertiləri bu yeni node-a bərabər olur.
    3. Əgər stack-də artıq element varsa:
      • Mövcud first dəyərini müvəqqəti (temp) dəyişəndə saxlayırıq.
      • Yeni node-u first kimi təyin edirik.
      • Yeni first-in next propertiyini əvvəlki first-ə yönəldirik.
    4. Stack-in ölçüsünü (size) artırırıq.

    Kod:

    push(value) {
      const newNode = new Node(value);
      
      if (!this.first) {
        this.first = newNode;
        this.last = newNode;
      } else {
        const temp = this.first;
        this.first = newNode;
        this.first.next = temp;
      }
    
      return ++this.size;
    }
    

    Element Silmə (Pop) — O(1)

    Stack-in üstündən element silmək üçün pop() metodunu yazırıq.

    Addım-addım izah:

    1. Əgər stack boşdursa (this.first === null), null qaytarırıq.
    2. Mövcud first dəyərini müvəqqəti (temp) dəyişəndə saxlayırıq.
    3. Əgər stack-də tək element varsa (first === last), last-i null edirik.
    4. First dəyərini this.first.next-ə təyin edirik.
    5. Stack-in ölçüsünü (size) azaldırıq və silinmiş elementin (temp) dəyərini qaytarırıq.

    Kod:

    pop() {
      if (!this.first) return null;
      
      const temp = this.first;
      
      if (this.first === this.last) {
        this.last = null;
      }
    
      this.first = this.first.next;
      this.size--;
    
      return temp.value;
    }
    

    Nəticə

    Stack, proqramlaşdırmada geniş istifadə olunan mühüm məlumat strukturudur. LIFO prinsipi ilə işləyir və element əlavə etmə və silmə əməliyyatları O(1) vaxt mürəkkəbliyinə malikdir.

    Bu məqalədə Stack-in JavaScript-də necə qurulmasını və push/pop əməliyyatlarının necə həyata keçirildiyini öyrəndik. Stack, xüsusilə funksiya çağırışlarının idarə olunması, undo/redo əməliyyatları və brauzer tarixçəsinin idarə edilməsi kimi sahələrdə geniş istifadə edilir.

    Data strukturu stack structure lifo

  • Ubuntu 22.04-də Docker-in quraşdırılması və istifadəsi
    codexC codex

    Docker tətbiqləri konteynerlərdə idarə etməyə imkan verən məşhur açıq mənbəli platformadır. Ubuntu 22.04-də Docker-i quraşdırmaq və istifadə etmək üçün aşağıdakı addımları tətbiq edə bilərsiniz.

    1. Sistem yeniləməsi

    Əvvəlcə sistem paketlərini yeniləyin:

    sudo apt update && sudo apt upgrade -y
    

    2. Lazımi asılılıqları quraşdırın

    Docker-in işləməsi üçün bəzi vacib paketləri quraşdırın:

    sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
    

    3. Docker açarlarını əlavə edin və repository-ni qoşun

    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
    echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
    

    4. Docker-i quraşdırın

    sudo apt update
    sudo apt install docker-ce docker-ce-cli containerd.io -y
    

    5. Docker servisini başladın

    sudo systemctl start docker
    sudo systemctl enable docker
    

    6. Docker versiyasını yoxlayın

    Quraşdırmanın uğurlu olub-olmadığını yoxlamaq üçün:

    docker --version
    

    7. Docker əmrinin sudo-suz işlətmək

    İstifadəçinizi docker qrupuna əlavə edin:

    sudo usermod -aG docker $USER
    

    Dəyişikliklərin qüvvəyə minməsi üçün terminalı bağlayıb yenidən açın və ya bu əmri işlədin: su - ${USER}.

    8. Test konteynerini işə salın (vacib deyil)

    docker run hello-world
    

    Bu əmrlə Docker mühitinizin düzgün işlədiyini test edə bilərsiniz.

    Nəticə

    Bu addımları yerinə yetirərək Ubuntu 22.04-də Docker-i uğurla quraşdıra və istifadə etməyə başlaya bilərsiniz. Docker konteyner texnologiyası inkişaf etdiricilər və sistem administratorları üçün böyük rahatlıq yaradır.

    Docker docker ubuntu installation

  • Google kodlaşdırma müsahibə sualını necə həll etmək olar
    codexC codex

    Google şirkəti hər zaman öz müsahibələri ilə dünyada fərqlənib və elə bir proqramçı olmaz ki, həmən müsahibələrdə iştirak etmək istəməsin. Həmən anlardan birinidə youtube videosu kimi paylaşıram. Fikirləriniz maraqlı olardı.

    İT müsahibələri google müsahibə coding

  • Blockchain proqramçısının yol xəritəsi
    codexC codex

    Blockchain proqramçısı olmaq istəyirsinizsə, aşağıdakı əsas sahələrə diqqət yetirməyiniz tövsiyə olunur:

    Əsas Blockchain Bilikləri:

    • Blockchain Strukturu və Əməliyyatları: Blockchain-in necə işlədiyini, onun strukturu və əməliyyatlarını öyrənin.
    • Tətbiqlər və İstifadə Sahələri: Blockchain texnologiyasının müxtəlif sahələrdə necə tətbiq edildiyini araşdırın.

    Ümumi Blockchain Məlumatları:

    • Mədənçilik və Təşviq Modelləri: Mədənçilik prosesini və təşviq modellərini öyrənin.
    • Kriptovalyutalar və Kriptopulqabılar: Fərqli kriptovalyutaları və onların saxlanması üçün kriptocüzdanları araşdırın.
    • Kriptoqrafiya və Konsensus Protokolları: Kriptoqrafiyanın əsaslarını və konsensus protokollarını öyrənin.

    Platformalar və Alətlər:

    • EVM-əsaslı Blockchain-lər: Ethereum, Polygon, Binance Smart Chain kimi platformaları araşdırın.
    • Oracles və Hibrid Smart Müqavilələr: Chainlink kimi oracle şəbəkələri və hibrid smart müqavilələr haqqında məlumat əldə edin.

    Proqramlaşdırma və Smart Müqavilələr:

    • Proqramlaşdırma Dilləri: Solidity, Vyper, Rust kimi dilləri öyrənin.
    • Smart Müqavilələrin Testi və Təhlükəsizliyi: Smart müqavilələrin test edilməsi, təhlükəsizlik təcrübələri və hücum vektorları haqqında məlumat əldə edin.

    Decentralized Tətbiqlər (dApps):

    • dApps-ın Tətbiq Sahələri: DeFi, DAO, NFT-lər kimi sahələrdə dApps inkişaf etdirməyi öyrənin.
    • Frontend Çərçivələri: React, Angular, Vue kimi frontend çərçivələri ilə işləməyi bacarın.

    Bu sahələrdə bilik və bacarıqlarınızı inkişaf etdirərək, blockchain inkişaf etdiricisi kimi karyeranıza uğurla başlaya bilərsiniz.

    Link Preview Image
    Blockchain Developer Roadmap: Learn to become a blockchain developer

    Learn to become a blockchain developer using this roadmap. Community driven, articles, resources, guides, interview questions, quizzes for modern backend development.

    favicon

    roadmap.sh (roadmap.sh)

    Blockchain və Web3 blockchain roadmap decentralized

  • Bubble Sort (Köpük Sıralama) alqoritmi
    codexC codex

    Bubble Sort, ən sadə sıralama alqoritmlərindən biridir. Bu metod, verilmiş siyahıda ardıcıl elementləri müqayisə edərək və lazım olduqda yerlərini dəyişərək işləyir. Bu proses, siyahı tam sıralanana qədər təkrarlanır.

    Bubble Sort Necə İşləyir?

    Bu alqoritm adını, kiçik elementlərin yuxarı qalxması və böyük elementlərin aşağı düşməsi prinsipindən alır. Sadə və başa düşülməsi asan olsa da, böyük verilənlər üçün effektiv deyil.

    📌 Mürəkkəblik: O(n²), burada n sıralanacaq elementlərin sayıdır. Bu, böyük massivlər üçün çox yavaş və əlverişsizdir.


    Bubble Sort Alqoritminin Addımları

    1. Bir funksiya yaradın və siyahını parametr kimi qəbul edin.
    2. Əsas dövrü (for loop) sondan əvvələ doğru işlədin.
    3. Daxili dövrü (for loop) əvvəldən i-1-ə qədər işlədin.
    4. Əgər arr[j] > arr[j+1]-dirsə, bu iki elementi dəyişdirin.
    5. Sıralanmış massivi qaytarın.
    6. Təkmilləşdirmə: noSwap dəyişəni əlavə edin və heç bir dəyişiklik olmazsa, dövrü erkən dayandırın.

    For Loop ilə Bubble Sort Həlli

    const bubbleSorting = (arr) => {
      let noSwaps;
      
      for (let i = arr.length; i > 0; i--) {
        noSwaps = true;
        
        for (let j = 0; j < i - 1; j++) {
          if (arr[j] > arr[j + 1]) {
            const temp = arr[j];
            arr[j] = arr[j + 1];
            arr[j + 1] = temp;
            noSwaps = false;
          }
        }
        
        if (noSwaps) break; // Dəyişiklik yoxdursa, dövrü bitiririk
      }
      
      return arr;
    };
    
    console.log(bubbleSorting([11, 2, 1234, 88, 3, 66, 876]));
    

    ✅ Üstünlüklər:

    • Kiçik verilənlər üçün işləyir.
    • Optimallaşdırma ilə erkən dayandırıla bilər (noSwaps).

    ❌ Çatışmazlıqlar:

    • Böyük massivlər üçün çox yavaşdır (O(n²)).

    Rekursiya ilə Bubble Sort Həlli

    Bu versiya təkrarlanan dövrlər (loops) əvəzinə rekursiv yanaşmadan istifadə edir.

    function bubbleSort(arr, n = arr.length) {
      // Əsas şərt: yalnız 1 və ya 0 element varsa, artıq sıralanıb
      if (n <= 1) {
        return arr;
      }
    
      // Bir dəfə Bubble Sort tətbiq edirik
      for (let i = 0; i < n - 1; i++) {
        if (arr[i] > arr[i + 1]) {
          // İki elementi dəyişdiririk
          [arr[i], arr[i + 1]] = [arr[i + 1], arr[i]];
        }
      }
    
      // Rekursiv olaraq funksiyanı çağırırıq
      return bubbleSort(arr, n - 1);
    }
    
    const arr = [64, 34, 25, 12, 22, 11, 90];
    console.log(bubbleSort(arr));
    

    ✅ Üstünlüklər:

    • Loops (dövrlər) yerinə rekursiya istifadə edir.

    ❌ Çatışmazlıqlar:

    • Əlavə yaddaş tələb edə bilər (rekursiya dərinliyi çox olarsa).

    TypeScript ilə Generic Bubble Sort Həlli

    Bu versiya istənilən verilənlər tipini qəbul edə bilən (Generic) Bubble Sort metodudur.

    function bubbleSort<T>(arr: T[]): T[] {
      const n = arr.length;
    
      for (let i = 0; i < n - 1; i++) {
        for (let j = 0; j < n - i - 1; j++) {
          if (arr[j] > arr[j + 1]) {
            [arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
          }
        }
      }
    
      return arr;
    }
    

    ✅ Üstünlüklər:

    • Həm rəqəmlərlə, həm də digər tipdəki verilənlərlə işləyə bilir.
    • TypeScript-in təhlükəsizliyindən istifadə edir.

    Nəticə

    Metod Mürəkkəblik Üstünlüklər Çatışmazlıqlar
    For Loop Bubble Sort O(n²) Sadə və başa düşülən Böyük verilənlər üçün səmərəsiz
    Rekursiya ilə Bubble Sort O(n²) Dövr (loop) istifadə etmir Yaddaş istifadəsi arta bilər
    TypeScript Generic Bubble Sort O(n²) Müxtəlif verilənlər ilə işləyir O(n²) olduğu üçün yenə də yavaşdır

    🚀 Alternativlər: Quick Sort və Merge Sort daha effektiv sıralama metodlarıdır.

    🔹 Bubble Sort yalnız kiçik massivlər üçün və tədris məqsədilə tövsiyə olunur!

    Alqoritmlər

  • IDDA - Xsolla Incubator Program
    codexC codex

    🎮✨ Azərbaycanın oyun ekosistemində yeni üfüqlər açılır!

    🚀 Belə ki, ölkəmizdə ilk dəfə oyun ekosistemi üçün İRİA və “Xsolla” şirkətinin əməkdaşlığı ilə “IDDA - Xsolla Incubator Program” adlı inkubasiya proqramı həyata keçiriləcək. Proqramın məqsədi yerli oyun studiyalarının qlobal bazara keçidinə dəstək göstərmək, potensial investorlarla əlaqələr yaratmaq və Azərbaycanın oyun sənayesini gücləndirərək rəqabətqabiliyyətli ekosistem formalaşdırmaqdır.

    💡 Proqramda iştirakçıları nələr gözləyir?

    ✅ Beynəlxalq ekspertlərlə təlimlərdə iştirak imkanı;
    ✅ Peşəkar mentor dəstəyi;
    ✅ Qlobal bazarların rəqabət strategiyaları ilə yaxından tanışlıq;
    ✅ Potensial investorlarla şəbəkələşmək fürsətləri.

    ✨ Kimlər iştirak edə bilər?

    🔹 Oyun prototipi olan komandalar;
    🔹 Maksimum 4 nəfərlik həvəskar komandalar;
    🔹 Oyun yaratmaq istəyən startaplar.

    🏆 Qalibləri hansı mükafatlar gözləyir?

    🥇 1-ci yer - 100 000 AZN
    🥈 2-ci yer - 75 000 AZN
    🥉 3-cü yer - 50 000 AZN

    📅 Son qeydiyyat tarixi: 18.04.2025

    ℹ️ Qeyd edək ki, may ayında start götürəcək proqram üç ay davam edəcək və hibrid formatda həyata keçiriləcək. Qaliblər isə avqust ayında keçiriləcək final təqdimatında elan olunacaq.

    🔗 Qeydiyyatdan keçmək üçün linkə keçid edə bilərsiniz.
    https://docs.google.com/forms/d/e/1FAIpQLSfQgxd8HxQLUWuDSCvMsY-l3b9N5NTC6Y41IQTCm8nFARytPg/viewform

    🎯 Ekosistemin ən güclü oyunçusu olmaq fürsətini qaçırmayın!

    İT tədbirlər xsolla gamedev idda gaming

  • Sliding window nümunəsi
    codexC codex

    Aşağıda LeetCode platformasında bu nümunə ilə həll edilə bilinən problemlərin siyahısı aşağıdakı kimidir. Əgər bildiyiniz problemlər varsa aşağıda əlavə edə bilərsiniz:

    • 643. Maximum Average Subarray I
    • 3. Longest Substring Without Repeating Characters
    • 438. Find All Anagrams in a String
    • 413. Arithmetic Slices
    • 219. Contains Duplicate II
    • 209. Minimum Size Subarray Sum
    • 187. Repeated DNA Sequences
    • 30. Substring with Concatenation of All Words

    Bütün problemlərin siyahısını isə buradan baxa bilərsiz.

    Problem həlli yanaşması sliding window pattern problem solving

  • Divide and conquer nümunəsi
    codexC codex

    Böl və idarə et (Divide and Conquer) nümunəsi, verilənləri kiçik hissələrə bölməklə və sonra hər bir hissədə təkrarlanan proses tətbiq etməklə problemləri həll etməyə əsaslanır. Bu yanaşma, xüsusilə axtarış və sıralama alqoritmlərində geniş istifadə olunur.


    Məsələ

    Verilmiş sıralanmış tam ədəd massivində, müəyyən bir dəyəri tapan bir funksiya yazın. Əgər dəyər varsa, onun indeksini qaytarsın, əks halda -1 qaytarsın.


    Naiv həll (O(n))

    Bu yanaşma, massivin hər bir elementini yoxlayır və uyğunluğu tapana qədər davam edir.

    Kod:

    function search(array, num) {
      for (let i = 0; i < array.length; i++) {
        if (num === array[i]) return i;
      }
    
      return -1;
    }
    
    console.log(search([1, 2, 3, 4, 5, 6, 7, 8], 5)); // 4
    

    🔴 Mürəkkəblik: O(n) (çünki ən pis halda bütün elementləri yoxlamalıyıq).


    Böl və idarə et həlli (O(log n))

    Bu yanaşma massivi iki hissəyə bölərək daha sürətli həll təklif edir (İkili Axtarış – Binary Search).

    Kod:

    function search(array, num) {
      let min = 0;
      let max = array.length - 1;
    
      while (min <= max) {
        let middle = Math.floor((min + max) / 2);
        let currentElement = array[middle];
    
        if (currentElement < num) {
          min = middle + 1;
        } else if (currentElement > num) {
          max = middle - 1;
        } else {
          return middle;
        }
      }
    
      return -1;
    }
    
    console.log(search([1, 2, 3, 4, 5, 6, 7, 8], 5)); // 4
    

    🔵 Mürəkkəblik: O(log n) (çünki hər iterasiyada massivi yarıya bölürük).


    Nəticə

    ✅ Naiv olan həll tək-tək axtarır və O(n) vaxt aparır.
    ✅ Böl və idarə et həlli kəsərək daha sürətli nəticə verir və O(log n) mürəkkəbliyinə malikdir.

    🚀 İkili axtarış metodu böyük verilənlər üzərində daha effektiv işləyir!

    Problem həlli yanaşması divide conquer solving problem pattern

  • Sliding window nümunəsi
    codexC codex

    Sliding window nümunəsi bir “pəncərə” yaratmaqdan ibarətdir. Bu “pəncərə” ya bir massivdəki elementlər qrupu, ya da bir rəqəm ola bilər. Müəyyən şərtlərə əsasən “pəncərə” genişlənə və ya bağlana bilər (və ya yeni bir “pəncərə” yaradıla bilər).

    Bu nümunə, massivdə və ya sətirdə məlumat alt dəstini izləmək üçün çox faydalıdır.


    Problem

    Bir maxSubarraySum funksiyası yazın. Bu funksiya tam ədədlərdən ibarət bir massiv və n adlı bir rəqəm qəbul etməlidir. Funksiya massivdə ardıcıl n elementin maksimum cəmini tapmalıdır.


    Naiv həll

    Bu üsul massivdəki bütün mümkün n uzunluqlu alt massivləri yoxlayır və onların cəmini hesablayır.

    Zaman mürəkkəbliyi: O(n²)

    function maxSubarraySum(array, num) {
      if (num > array.length) return null;
    
      let max = -Infinity;
      for (let i = 0; i < array.length - num + 1; i++) {
        let temp = 0;
    
        for (let j = 0; j < num; j++) {
          temp += array[i + j];
        }
    
        if (temp > max) {
          max = temp;
        }
      }
    
      return max;
    }
    
    maxSubarraySum([1, 2, 5, 2, 8, 1, 5], 4); // 17
    

    Çatışmazlıqlar:

    🔴 Hər bir alt massiv üçün n dəfə toplanma əməliyyatı aparırıq.
    🔴 Böyük massivlər üçün performans çox aşağı olur.


    Sliding window həlli

    Bu üsulda bir pəncərə (window) istifadə edirik və onu hərəkət etdiririk.

    Məntiq:

    1. Əvvəlcə ilk n elementin cəmini hesablayırıq.
    2. Sonra bu cəmi tədricən yeniləyirik:
      • Yeni elementi əlavə edirik.
      • Əvvəlki pəncərədən çıxan elementi çıxırıq.
    3. Ən böyük cəmi tapırıq.

    Zaman mürəkkəbliyi: O(n)

    function maxSubarraySum(array, num) {
      let maxSum = 0;
      let tempSum = 0;
      if (num > array.length) return null;
    
      for (let j = 0; j < num; j++) {
        maxSum += array[j];
      }
    
      tempSum = maxSum;
    
      for (let i = num; i < array.length; i++) {
        tempSum = tempSum - array[i - num] + array[i];
        maxSum = Math.max(maxSum, tempSum);
      }
    
      return maxSum;
    }
    
    maxSubarraySum([1, 2, 5, 2, 8, 1, 5], 4); // 17
    

    Üstünlüklər:

    ✅ O(n²) əvəzinə O(n) mürəkkəbliklə işləyir.
    ✅ Daha az yaddaş istifadə edir.
    ✅ Böyük massivlər üçün daha effektivdir.


    Nəticə

    Sliding window nümunəsi ardıcıl verilənləri analiz edərkən çox güclü üsuldur. Bu metod sürətli və yaddaş baxımından effektiv həllər yaratmağa imkan verir.

    Bu yanaşma aşağıdakı hallarda xüsusilə faydalıdır:
    ✔ Ardıcıl ən böyük və ya ən kiçik məbləği tapmaq
    ✔ Sətirlərdə və massivlərdə xüsusi ardıcıllıqları izləmək
    ✔ Məlumat axınını optimallaşdırmaq

    Problem həlli yanaşması sliding window pattern problem solving

  • Multiple pointers nümunəsi
    codexC codex

    Multiple pointers nümunəsi indeks və ya mövqeyə uyğun olaraq göstəricilər və ya dəyərlər yaratmaq və müəyyən şərtlərə əsasən başlanğıc, son və ya orta hissəyə doğru hərəkət etdirmək üsuludur.

    Problem

    Bir sumZero funksiyası yazın. Bu funksiya sıralanmış tam ədədlər massivini qəbul edir. Funksiya cəmi 0 olan ilk cütlüyü tapmalıdır. Əgər belə bir cütlük mövcuddursa, onu massiv şəklində qaytarsın, əks halda undefined qaytarsın.


    Naiv Həll

    Bu üsul massivdəki hər bir elementi digər elementlərlə müqayisə edir. İki for dövrü istifadə olunduğu üçün zaman mürəkkəbliyi O(n²)-dir.

    function sumZero(arr) {
        for (let i = 0; i < arr.length; i++) {
            for (let j = i + 1; j < arr.length; j++) {
                if (arr[i] + arr[j] === 0) {
                    return [arr[i], arr[j]];
                }
            }
        }
    }
    
    sumZero([-4, -3, -2, -1, 0, 1, 2, 5]); 
    

    Çatışmazlıqlar:

    • Massiv çox böyük olduqda performans aşağı düşür.
    • Hər bir elementi digər elementlə müqayisə etdiyimiz üçün lazımsız təkrarlanmalara səbəb olur.

    Multiple Pointer Həlli

    Bu üsulda iki göstərici (pointer) istifadə edirik:

    • Sol pointer (left) – massivdəki ilk elementdən başlayır.
    • Sağ pointer (right) – massivdəki son elementdən başlayır.

    Məntiq:

    • Əgər arr[left] + arr[right] === 0 isə, bu cütlük qaytarılır.
    • Əgər cəmi 0-dan böyükdürsə, sağ pointer (right--) bir vahid sola çəkilir.
    • Əgər cəmi 0-dan kiçikdirsə, sol pointer (left++) bir vahid sağa çəkilir.

    Zaman mürəkkəbliyi O(n) olduğu üçün bu yanaşma daha effektivdir.

    function sumZero(array) {
        let left = 0, right = array.length - 1;
    
        while (left < right) {
            let sum = array[left] + array[right];
    
            if (sum === 0) {
                return [array[left], array[right]];
            } else if (sum > 0) {
                right--;
            } else {
                left++;
            }
        }
    }
    
    sumZero([-4, -3, -2, -1, 0, 1, 2, 5]); 
    

    Üstünlüklər:
    ✅ Yalnız bir while dövrü istifadə etdiyi üçün daha sürətlidir.
    ✅ Yaddaş sərfiyyatı daha azdır.
    ✅ Böyük massivlər üçün effektiv nəticə verir.


    Nəticə

    Multiple pointers nümunəsi çox vaxt O(n²) mürəkkəblikdən O(n) mürəkkəbliyə keçməyə imkan verir. Bu metod xüsusilə sıralanmış massivlərdə istifadə üçün əladır, axtarış və müqayisə məsələlərində performansı artırır.

    Problem həlli yanaşması multiple pointers problem solving

  • Tezlik sayğacı nümunəsi (Frequency Counter Pattern)
    codexC codex

    Bu nümunə obyektlərdən (objects) və ya dəstlərdən (sets) istifadə edərək dəyərlərin və ya onların tezliklərinin toplanmasını nəzərdə tutur. Bu yanaşma, çox vaxt daxili döngülərin (nested loops) və O(n²) əməliyyatlarının qarşısını almağa kömək edir, xüsusən də massivlər (arrays) və sətirlərlə (strings) işləyərkən.


    Misal

    İki sətir verildikdə, ikinci sətirin birinci sətirin anagramı olub-olmadığını müəyyən edən bir funksiya yazın.

    Anagram nədir?
    Anagram – bir söz və ya ifadənin hərflərini yenidən düzərək başqa bir söz və ya ifadə yaratmaqdır.

    Məsələn:

    • “cinema” → “iceman”
    • “listen” → “silent”

    Direkt həll (O(n log n))

    Bu yanaşma, hər iki sətiri hərflərinə ayırıb sıralamaq və sonra onları müqayisə etmək üsuluna əsaslanır.

    Kod:

    function isAnagram(str1, str2) { 
      // Uzunluqlar fərqlidirsə, anagram ola bilməz
      if (str1.length !== str2.length) {
        return false;
      }
    
      // Hərfləri ayırıb sıralayırıq
      const arr1 = str1.split('').sort();
      const arr2 = str2.split('').sort();
    
      // Sıralanmış massivləri müqayisə edirik
      for (let i = 0; i < arr1.length; i++) {
        if (arr1[i] !== arr2[i]) {
          return false;
        }
      }
    
      return true;
    }
    
    // Test
    console.log(isAnagram("cinema", "iceman"));  // true
    console.log(isAnagram("hello", "world"));    // false
    

    ⏳ Bu həllin mürəkkəbliyi: O(n log n) (çünki sıralama əməliyyatı O(n log n) vaxt aparır).


    Tezlik sayğacı ilə həll (O(n))

    Bu yanaşma hərflərin sayını obyektlərdə saxlayaraq müqayisə etməyə əsaslanır. Sıralama əvəzinə sayma üsulu istifadə olunduğu üçün daha sürətlidir və O(n) mürəkkəbliyinə malikdir.

    Kod:

    function validAnagram(str1, str2) { 
        if (str1.length !== str2.length) return false;
        
        const obj = {};
        
        // İlk sətirdəki hərfləri sayırıq
        for (let i = 0; i < str1.length; i++) {
            const letter = str1[i];
            obj[letter] = ++obj[letter] || 1;
        }
    
        // İkinci sətirdəki hərfləri yoxlayırıq
        for (let j = 0; j < str2.length; j++) {
            const letter = str2[j];
            if (!obj[letter]) {
                return false;
            } else {
                obj[letter]--;
            }
        }
        
        return true;
    }
    
    // Test
    console.log(validAnagram('anagram', 'nagaram')) // true
    console.log(validAnagram('anagrams', 'nagaramm')) // false
    console.log(validAnagram("rat", "car")) // false
    

    ⏳ Bu həllin mürəkkəbliyi: O(n) (çünki hər iki sətir yalnız bir dəfə dövr edilir).


    Nəticə

    🔹 Direkt həll sətirləri sıralamaqla müqayisə edir və O(n log n) mürəkkəbliyinə malikdir.
    🔹 Tezlik sayğacı həlli isə hərflərin sayını yoxlamaqla daha sürətli və effektivdir (O(n)).

    ✨ Tezlik sayğacı nümunəsi, yalnız anagram yoxlamaq üçün deyil, müxtəlif massiv və sətir analizlərində də faydalıdır! 🚀

    Problem həlli yanaşması problem solving pattern frequency counter

  • Let's Encrypt sertifikatı itərsə bərpası
    codexC codex

    Bu yazıda başıma gələn hadısənin həllini heç-bir yerdə tapa bilməyərək müxtəlif resurslardan toplayaraq bir araya gətirmək istədim. ChatGPT sağolsun müəyyən əmrlərlə yardımçı olurdu lakin ardıcıllıq çox önəmli olduğundan proses tamamlanmırdı.

    Deməli iki server düşünün, A serverində işləyərkən onun dataları xarab olur və sən ayarları kopyalaya bilmirsən. Əgər sizin də Contabo serverinizdə layihəniz varsa o zaman bu sizin başınıza da gələ bilər 🙂

    Nə yaxşı ki, backup məntiqini düşünmüşdüm və layihələrin əsas data-ları bərpa etmək asanlıqla mümkün oldu.

    Bir həftədən sonra B serverini aldım və yenidən A serverində nələr etmişdimsə onu da konfiqurasiya edə bildim. Lakin saytlar yalnız http üzərindən işləyirdi və ya xəta verirdi.

    Mən nginx istifadə etdiyimdən online olaraq certbot vasitəsi ilə sertifikatların alınması çətin oldu. Ona görə də ilk öncə nginx-i söndürdüm:

    sudo systemctl stop nginx
    

    Sonra offline olaraq sertifikatları yenidən almağa cəht etdim:

    sudo certbot certonly --standalone -d example.com -d www.example.com --force-renewal
    

    Proseslərə razılığımı verdim və sertifikatlar uğurla yeniləndi. Sonra sayt üçün nginx configləri yenilədim. Ən önəmlisi də ssl_certificate hissəsinə nəzər yetirmək lazımdı ki, yenicə əldə etdiyimiz serifikatları düzgün təyin edə bilək.

    # /etc/nginx/site-available/example.com
    
    server {
        server_name example.com www.example.com;
    
        location / {
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_set_header Host $http_host;
            proxy_set_header X-NginX-Proxy true;
    
            proxy_pass http://127.0.0.1:8001;
            proxy_redirect off;
    
            # Socket.IO Support
            proxy_http_version 1.1;
            proxy_set_header Upgrade $http_upgrade;
            proxy_set_header Connection "upgrade";
        }
    
        listen 443 ssl http2; # managed by Certbot
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; # managed by Certbot
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; # managed by Certbot
    }
    

    Sonra nginx işə salırıq:

    sudo systemctl start nginx
    

    Əgər hər şeyi düzgün konfiqurasiya etmisinizsə o zaman xəta çıxmayacaq.

    Qarışıq mövzular letsencrypt server nginx

  • Tam ədədin ilk və son rəqəmlərinin cəmi
    codexC codex

    Tapşırıq:
    sumFirstAndLastDigit adlı bir metod yazın. Bu metod int tipində number adlı bir parametr qəbul edir.

    Metodun işləmə qaydası:

    • Verilən ədədin ilk və son rəqəmi tapılmalıdır.
    • Bunun üçün bir dövr (loop) istifadə edərək ilk rəqəmi müəyyənləşdirməlidir.
    • İlk və son rəqəmlərin cəmini qaytarmalıdır.
    • Əgər ədəd mənfidirsə, metod -1 qaytarmalıdır.

    Test Case
    ✅ sumFirstAndLastDigit(252); → 4 qaytarmalıdır, çünki ilk rəqəm 2, son rəqəm 2, və 2+2=4.
    ✅ sumFirstAndLastDigit(257); → 9 qaytarmalıdır, çünki ilk rəqəm 2, son rəqəm 7, və 2+7=9.
    ✅ sumFirstAndLastDigit(0); → 0 qaytarmalıdır, çünki yalnız bir rəqəm var (0), və 0+0=0.
    ✅ sumFirstAndLastDigit(5); → 10 qaytarmalıdır, çünki yalnız bir rəqəm var (5), və 5+5=10.
    ❌ sumFirstAndLastDigit(-10); → -1 qaytarmalıdır, çünki ədəd mənfidir və yalnız müsbət ədədlər qəbul edilir.

    Əlavə mürəkkəblik:
    Metodun gövdəsində (body) maksimum 6 sətrlik kod yazaraq həll edin.

    Java java tapşırıq junior int

  • Abstrakt fabrik (Abstract Factory Pattern)
    codexC codex

    Abstract Factory nümunəsi, konkret klasları(classes) göstərmədən, bir-biri ilə əlaqəli və ya asılı olan obyektlər ailəsini yaratmaq üçün bir interfeys təmin edir.

    Misal üçün

    // Abstrakt Məhsul
    class Button {
      render() {
        throw new Error("Bu metodu override edin!");
      }
    }
    

    Button klası abstrakt məhsuldur. O, bu klası genişləndirən hər hansı konkret məhsul tərəfindən mütləq yenidən yazılmalı olan render metodunu müəyyən edir.

    // Konkret Məhsul
    class WindowsButton extends Button {
      render() {
        console.log("Windows üslubunda düymənin göstərilməsi.");
      }
    }
    
    class MacOSButton extends Button {
      render() {
        console.log("MacOS üslubunda düymənin göstərilməsi.");
      }
    }
    

    WindowsButton və MacOSButton, Button klasını genişləndirən konkret məhsullardır. Onlar render metodunun spesifik realizasiyasını təmin edirlər.

    // Abstrakt fabrik
    class GUIFactory {
      createButton() {
        throw new Error("Bu metodu override edin!");
      }
    }
    

    GUIFactory klası abstrakt fabrikdir. O, bu klası genişləndirən hər hansı konkret fabrik tərəfindən mütləq yenidən yazılmalı olan createButton metodunu müəyyən edir.

    // Konkret fabrik
    class WindowsFactory extends GUIFactory {
      createButton() {
        return new WindowsButton();
      }
    }
    
    class MacOSFactory extends GUIFactory {
      createButton() {
        return new MacOSButton();
      }
    }
    

    WindowsFactory və MacOSFactory, GUIFactory klasını genişləndirən konkret fabriklərdir. Onlar createButton metodunun spesifik realizasiyasını təmin edirlər və müvafiq olaraq WindowsButton və MacOSButton instansiyalarını qaytarırlar.

    // Klient tərəfin kodu
    function createUI(factory) {
      const button = factory.createButton();
      button.render();
    }
    

    createUI funksiyası, fabriki istifadə edərək düymə yaratmaq və render etmək üçün klient kodudur. Bu funksiya fabriki arqument olaraq qəbul edir, fabrikin createButton metodunu çağırır və düyməni alır, sonra isə düymənin render metodunu çağırır.

    İstifadəsi

    const windowsFactory = new WindowsFactory();
    createUI(windowsFactory);
    
    const macFactory = new MacOSFactory();
    createUI(macFactory);
    

    Xülasə

    Burada, biz WindowsFactory və MacOSFactory instansiyalarını yaradıb, onları createUI funksiyasına ötürürük. Bu, kodun fərqli fabriklərlə işləyərək düymələri müxtəlif üslublarda yaratma və render etmə üsulunu nümayiş etdirir. Abstract Factory nümunəsi klient kodunun yaratması lazım olan obyektlərin konkret klaslardan ayrılmasına imkan verir, bu da çeviklik və genişlənə bilənlik təmin edir.

    Dizayn nümunələri abstract fabric pattern javascript creational
  • 1
  • 2
  • 3
  • 4
  • 4 / 4
  • Daxil ol

  • Sizin hesabınız yoxdur? Qeydiyyatdan keç

  • Axtarış etmək üçün daxil olun və ya qeydiyyatdan keçin.
  • İlk yazı
    Son yazı
0
  • Kateqoriyalar
  • Ən yeni
  • Teqlər
  • Populyar