Ýaýradylan senesi

TypeScript taryhyny ýazmakda gazanylan umumy tejribeler

Awtorlar

"Common-char-extractor-ts" diýen GitHub depom: https://github.com/ImBIOS/common-char-extractor-ts

Kodlaşdyrma interwýular dünýäsinde, algoritmik çykyşmalar diňe tehniki bilimleriň synagy däl-de, eýsem kandidatlaryň problem çözmäge bolan başarnyklarynyň aýnasydyr. Şeýle bir gyzykly problem, köplenç duş gelýän, string işlemleri bilen baglydyr - bu programmistleriň arsenalindäki esasy başarnyk. Şu gün biz täsirli bir problema girenýäris: birnäçe stringde umumy belgileri kesgitlemek we olary TypeScript arkaly nädip çözmegiň ýoluny öwrenýäris.

Açylan Çykyşma

Ýüze çykan wezipe ýönekeý görünýärdi, ýöne aňsat däldi: berilen stringler massiwinden, ähli stringlerde birnäçe pozisiýada görünýän belgileriň massiwini çykaryp, gaýtaryp berýän funksiýa ýazmalydyk. Mysal üçin, ["abcd", "bcd", "cde", "cdef"] girişiniň üçin, garaşylýan çykyş ["c", "d"] bolar, bu "c" we "d" belgilerinin ähli stringlerde degişli pozisiýalarda umumy bolandygyny aňladýar.

Çözgüniň Ýasalmagy

Ýolymyz çözgüniň TypeScript bilen saýlanmagyndan başlady - bu TypeScript-iň güýçli tip ulgamy sebäpli, kodyň ygtybarlylygyny we programmistleriň önümli işini ýokarlandyrýar. Başlangyç ädim birinji stringiň her bir belgisini geçmekden, ony soňky stringlerdäki degişli belgiler bilen deňeşdirmek üçin ýüzlenmedir.

/**
 * Giriş massiwi içindeki ähli stringlerde birnäçe pozisiýada görünýän belgileriň massiwini çykaryp, gaýtaryp berýär.
 *
 * @param {string[]} words - Analiz ediljek stringler massiwi.
 * @returns {string[]} Berilen ähli stringlerde umumy bolan belgileriň massiwi,
 * ilkinji stringde görünýän tertibine laýyk saklanýar.
 */
export function extractCommonLetters(words: string[]): string[] {
  if (words.length === 0) {
    return []
  }

  const copiedWords = [...words]
  const result: string[] = []
  const referenceWord = copiedWords[0]

  // Birinji sözüň her bir belgisini geçmek
  for (let i = 0; i < referenceWord.length; i++) {
    const currentChar = referenceWord[i]
    let isCharCommonAcrossWords = true

    // Häzirki belginiň beýleki her bir sözde bar-ýokdygyny barlamak
    for (let j = 1; j < copiedWords.length; j++) {
      const word = copiedWords[j]
      const charIndex = word.indexOf(currentChar)

      // Eger belgi tapylmasa, aýrylyp, bayrak ýalňyş ýagdaýa getirilýär
      if (charIndex === -1) {
        isCharCommonAcrossWords = false
        break
      } else {
        // Tapylýan belgini sözden aýyrmak, ýinelmeler bilen işlemek üçin
        copiedWords[j] = word.slice(0, charIndex) + word.slice(charIndex + 1)
      }
    }

    // Eger belgi ähli sözlerde umumy bolsa, netijä goşulýar
    if (isCharCommonAcrossWords) {
      result.push(currentChar)
    }
  }

  return result
}

Bu bölek strategiýamyzyň esasy bölegini öz içine alýar, problemy çözmek üçin okunmaýanlygy we aňsat logikany aýratyn nygtadýar.

Ýene-de Ileri Gitmek: Çözgüni Synamak

Çözgümiň dogrulygyny barlamak üçin, dürli senarilere degişli synanyşlar toplumyny ulandyk - esasy senarilerden, ýörite belgiler we ýagdaý duýgurlygy bolan has kyn senarilere çenli. Bu doly synag, algoritmimiň dürli girişler toplumynda ygtybarlylygyny we dogrylygyny üpjün etdi.

Giňişlik we Wagt Gatylyklygyny Analiz etmek

Düşünmek bilen, çözgümiň wagt gatylyklygy esasan birinji stringdäki belgileriň sany bilen kesgitlenýär (munu N diýip görkezeýek) we stringleriň umumy sany bilen (munu M diýip görkezeýek). Birinji stringdäki her bir belgi üçin, ähli beýleki stringlerdäki degişli pozisiýada bolmagyny barlaýarys, bu bolsa O(N*M) wagt gatylyklygyna getirýär.

Çözgümiň giňişlik gatylyklygy O(N) -dir, sebäbi umumy belgileri massiwe saklaýarys. Iň ýaman senaride, ähli belgiler ähli stringlerde umumy bolanda, bu massiwiň möçberi birinji stringiň uzynlygyna deň bolardy.

Ýakşylanmagyň Ýollary

Çözgümiň orta möçerdäki stringler we belgiler üçin netijeli bolup durýarka, hemişe ösdürmegiň mümkinçiligi bar. Netijeliligi ýene-de ýokarlandyrmak üçin birnäçe strategiýa bar:

  1. Erte Bes etmek: Eger her hanysy bir noktada bir belgi ähli stringlerdäki degişli pozisiýada gabat gelmese, döngüden erte bes edip bileris, gerek bolmadyk deňeşdirmeleri saklaýarys.

  2. Gysga Stringler üçin Optimizasiýa: Ýüzlenmek üçin iň gysga stringi saýlamak, barlanylmaly belgileriň sanyny azaldyp, döngüler sanyny azaldyp biler.

  3. Paralel İşleýiş: Ülkän maglumatlar toplumy üçin, stringlerdäki belgileri deňeşdirmek üçin paralel işleýiş usullaryny ulanmak, ýerine ýetiriliş wagtyny ep-esli azaldyp biler.

  4. Heşleşdirme Usullary: Belgileriň pozisiýalaryny we ýinelmeler sanyny ýatda saklamak üçin heş massiwini ulanmak, aýratyn-da giň stringler toplumy bilen işleýän wagtyňyz umumy belgileri kesgitlemek üçin has kyn bir ýol hökmünde işleýär.

Ýekun Pikirler

Umumy belgiler çykyşmasy, string işleýiş meseleleriniň nezaketiniň aýdyň göze çarpaýan subutnamasydyr, bu bolsa programmistleri algoritmleriň we maglumat gurluşlarynyň nüanslaryna girenmegi höweslendirýär. TypeScript arkaly, biz diňe çözgüni tapmak bilen däl, eýsem aýdyňlyk, tip howpsuzlygy we netijeli problem çözmegiň ýoluny hem kabul etdik.

Ýekunlaşdyrýan wagtymyzda, kodlaşdyrma çykyşmalar ýoluna gidýän ýolyň, ýetilen maksada deň derejede wajypdygyny ýatda saklamak gerek. Her bir problem, şuňa meňzeş, başarnyklarymyzy kämilleşdirmek, strategiýalarymyzy gaýtadan gözden geçirmek we iň wajyby, öwrenmäge dowam etmek üçin özboluşly mümkinçilik berýär.