- Yayımlanma tarixi
TypeScript Tarixinin Yazısı ilə Bağlı Ümumi Çətinliklərin Üstələnməsi
- Müəllif(lər)
- Ad
- Imamuzzaki Abu Salam
- https://x.com/ImBIOS_Dev
https://github.com/ImBIOS/common-char-extractor-ts
GitHub Deposu:Kodlaşdırma müsahibələri aləmində, alqoritmik problemlər yalnız texniki bilik sınağı kimi deyil, həm də namizədlərin problem həll etmə bacarıqlarını ortaya qoyan pəncərələr kimi xidmət edir. Belə maraqlı problemlərdən biri, tez-tez qarşılaşdığımız, simli manipulyasiya ilə bağlıdır – bir developer arsenalında əsas bacarıq. Bu gün biz cəlbedici bir problemə dalırıq: bir neçə simli boyunca ümumi simvolları müəyyənləşdirmək və TypeScript istifadə edərək həllini necə əldə etdiyimiz.
Aşkar Olunan Çətinlik
Qarşılaşdığımız vəzifə göründüyü qədər sadə olmasına baxmayaraq, aldadıcı dərəcədə mürəkkəb idi: verilmiş simli massivə, bütün simlilərdə eyni mövqedə olan simvolları çıxarıb qaytaran bir funksiya yazmalı idik. Məsələn, ["abcd", "bcd", "cde", "cdef"]
girişini verildikdə, gözlənilən çıxış ["c", "d"]
olacaq, bu da 'c' və 'd' nin bütün simlilərdə uyğun mövqelərdə paylaşılan ümumi simvollar olduğunu göstərir.
Həlli Formalaşdırmaq
Səyahətimiz həlli üçün TypeScript seçimi ilə başladı – kod etibarlılığını və developer məhsuldarlığını artıran TypeScript'in güclü tip sistemi tərəfindən idarə olunan bir qərar. İlk addım, sonrakı simlilərlə müqayisə etmək üçün istinad olaraq istifadə edərək, ilk simlinin hər bir simvolu üzərində dövr etməyi əhatə edirdi.
/**
* Giriş massivindəki bütün simlilər arasında eyni mövqedə olan simvolları çıxarır və qaytarır.
*
* @param {string[]} words - Təhlil ediləcək simli massiv.
* @returns {string[]} Verilmiş bütün simlilərdə ümumi olan simvolların massivi,
* ilk simlidə görünüş sırasını saxlayır.
*/
export function extractCommonLetters(words: string[]): string[] {
if (words.length === 0) {
return []
}
const copiedWords = [...words]
const result: string[] = []
const referenceWord = copiedWords[0]
// İlk sözdəki hər bir simvol üzərində dövr et
for (let i = 0; i < referenceWord.length; i++) {
const currentChar = referenceWord[i]
let isCharCommonAcrossWords = true
// Cari simvolun digər hər bir sözdə mövcud olub-olmadığını yoxla
for (let j = 1; j < copiedWords.length; j++) {
const word = copiedWords[j]
const charIndex = word.indexOf(currentChar)
// Simvol tapılmasa, dövrü dayandır və bayrağı yanlış olaraq təyin et
if (charIndex === -1) {
isCharCommonAcrossWords = false
break
} else {
// Dublikatları idarə etmək üçün tapılan simvolu sözdən sil
copiedWords[j] = word.slice(0, charIndex) + word.slice(charIndex + 1)
}
}
// Simvol bütün sözlərdə ümumi olarsa, nəticəyə əlavə et
if (isCharCommonAcrossWords) {
result.push(currentChar)
}
}
return result
}
Bu kəsim, yanaşmamızın mahiyyətini əhatə edir, problemə çatmaq üçün oxunaqlılığı və sadə məntiqi vurğulayır.
Daha Uzağa Getmək: Həlli Sınamaq
Həlimizi təsdiqləmək üçün, xüsusi simvollar və böyük-kiçik hərf həssaslığı daxil olmaqla müxtəlif ssenariləri əhatə edən test halları dəsti tətbiq etdik. Bu hərtərəfli test, alqoritmimizin müxtəlif girişlər boyunca etibarlılığını və düzgünlüyünü təmin etdi.
Yaddaş və Zaman Mürəkkəbliyini Təhlil Etmək
Düşüncələrə əsaslanaraq, həlimizin zaman mürəkkəbliyi əsasən ilk simlinin simvol sayından (buraya N
deyək) və ümumi simli sayından (buraya M
deyək) təyin olunur. İlk simlinin hər bir simvolu üçün, digər bütün simlilərdə uyğun mövqedə olması yoxlanılır, bu da O(N*M) zaman mürəkkəbliyinə gətirib çıxarır.
Həlimizin yaddaş mürəkkəbliyi O(N) dir, çünki ümumi simvolları bir massivə saxlayırıq. Ən pis halda, bütün simvollar bütün simlilərdə ümumi olduqda, bu massiv ölçüsü ilk simlinin uzunluğuna mütənasib olacaq.
İyileştirme Yolları
Həlimiz orta sayda simli və simvol üçün səmərəli olsa da, hər zaman iyileştirme üçün yer var. Performansını daha da artırmaq üçün bir neçə strategiya var:
Erkən Sonlandırma: Hər hansı bir anda bir simvol bütün simlilərdə uyğun mövqedə uyğun gəlmirsə, dövrü erkən dayandıra bilərik, lazımsız müqayisələri qurtarırıq.
Qısa Simlilər üçün Optimallaşdırma: İstinad olaraq ən qısa simli ilə başlamaq, yoxlanılması lazım olan maksimum simvol sayını minimuma endirməsi səbəbindən, iterasiya sayını azalda bilər.
Paralel İşləmə: Böyük məlumatlar üçün, simvolları simlilərdə eyni vaxtda müqayisə etmək üçün paralel işləmə texnikalarından istifadə, icra vaxtını əhəmiyyətli dərəcədə azalda bilər.
Hashing Texnikaları: Simvol mövqeləri və hadisələrinin izini saxlamaq üçün hash map-dən istifadə, xüsusilə geniş simli dəstlər ilə işləyərkən, ümumi simvolları daha mürəkkəb şəkildə müəyyənləşdirmək üçün daha mükəmməl bir yol təklif edə bilər.
Nəticə Fikirleri
Ümumi simvollar problemi, string manipulyasiya problemlərinin zərifliyinin təsirli bir şahidi olaraq xidmət edir, developerləri alqoritmlər və məlumat strukturlarının incəliklərinə dalmağa dəvət edir. TypeScript vasitəsilə biz yalnız bir həll tapmadıq, həm də aydınlıq, tip təhlükəsizliyi və səmərəli problem həll etmə yoluna çıxdıq.
Sonlandırarkən, kodlaşdırma problemləri vasitəsilə səyahətin çatılan məqsəd qədər keçilən yol haqqında da olduğunu xatırlamaq vacibdir. Bu problem daxil olmaqla hər bir problem, bacarıqlarımızı təkmilləşdirmək, yanaşmalarımızı yenidən düşünmək və ən əsası, öyrənməyə davam etmək üçün unikal bir fürsət təqdim edir.