- প্রকাশিত
টাইপস্ক্রিপ্টের ইতিহাসের লেখার সাথে সম্পর্কিত সাধারণ চ্যালেঞ্জগুলি কাটিয়ে ওঠার
- লেখকগণ
- নাম
- Imamuzzaki Abu Salam
- https://x.com/ImBIOS_Dev
https://github.com/ImBIOS/common-char-extractor-ts
GitHub রিপো:কোডিং ইন্টারভিউয়ের ক্ষেত্রে, অ্যালগরিদমিক চ্যালেঞ্জগুলি কেবলমাত্র প্রযুক্তিগত জ্ঞানের পরীক্ষা হিসেবে কাজ করে না বরং প্রার্থীদের সমস্যা সমাধান করার দক্ষতার জানালা হিসেবেও কাজ করে। এ ধরনের একটি আকর্ষণীয় সমস্যা, যা প্রায়ই দেখা যায়, স্ট্রিং ম্যানিপুলেশনের চারপাশে ঘুরে- একজন ডেভেলপারের অস্ত্রাগারে একটি মৌলিক দক্ষতা। আজ, আমরা একটি আকর্ষণীয় সমস্যায় ঝাঁপিয়ে পড়ব: একাধিক স্ট্রিং জুড়ে সাধারণ অক্ষরগুলি সনাক্ত করা এবং টাইপস্ক্রিপ্ট ব্যবহার করে আমরা কীভাবে এর সমাধানে পৌঁছেছি।
চ্যালেঞ্জ প্রকাশিত
হাতে থাকা কাজটি স্পষ্টতই সহজ ছিল তবে প্রতারণামূলক জটিল: স্ট্রিংয়ের একটি অ্যারে দেওয়া হলে, আমরা এমন একটি ফাংশন লিখতে হবে যা সকল স্ট্রিং জুড়ে একই অবস্থানে প্রদর্শিত অক্ষরগুলির একটি অ্যারে নিষ্কাশন করে এবং ফেরত দেয়। উদাহরণস্বরূপ, ["abcd", "bcd", "cde", "cdef"]
ইনপুট দেওয়া হলে, প্রত্যাশিত আউটপুট হবে ["c", "d"]
, যা ইঙ্গিত দেয় যে 'c' এবং 'd' হল সকল স্ট্রিংয়ের মধ্যে সাধারণ অক্ষর যা সংশ্লিষ্ট অবস্থানে ভাগ করে নেওয়া হয়।
সমাধান তৈরি করা
আমাদের যাত্রা শুরু হয়েছিল টাইপস্ক্রিপ্টের জন্য সমাধানের পছন্দের সাথে - টাইপস্ক্রিপ্টের শক্তিশালী টাইপ সিস্টেম দ্বারা পরিচালিত একটি সিদ্ধান্ত, কোডের নির্ভরযোগ্যতা এবং ডেভেলপারের উৎপাদনশীলতা উন্নত করে। প্রাথমিক পদক্ষেপটি প্রথম স্ট্রিংয়ের প্রতিটি অক্ষরের উপর পুনরাবৃত্তি করে, পরবর্তী স্ট্রিংগুলিতে সংশ্লিষ্ট অক্ষরগুলির সাথে তুলনা করার জন্য এটিকে একটি রেফারেন্স হিসেবে ব্যবহার করে।
/**
* ইনপুট অ্যারেতে থাকা সমস্ত স্ট্রিং জুড়ে একই অবস্থানে প্রদর্শিত অক্ষরগুলির একটি অ্যারে
* নিষ্কাশন করে এবং ফেরত দেয়।
*
* @param {string[]} words - বিশ্লেষণ করা স্ট্রিংয়ের একটি অ্যারে।
* @returns {string[]} একটি অ্যারে যা সমস্ত প্রদত্ত স্ট্রিং জুড়ে সাধারণ,
* প্রথম স্ট্রিংয়ে তাদের উপস্থিতির ক্রম বজায় রাখে।
*/
export function extractCommonLetters(words: string[]): string[] {
if (words.length === 0) {
return []
}
const copiedWords = [...words]
const result: string[] = []
const referenceWord = copiedWords[0]
// প্রথম শব্দের প্রতিটি অক্ষরের উপর পুনরাবৃত্তি
for (let i = 0; i < referenceWord.length; i++) {
const currentChar = referenceWord[i]
let isCharCommonAcrossWords = true
// পরবর্তী শব্দের প্রতিটিতে বর্তমান অক্ষরটি আছে কিনা তা পরীক্ষা করুন
for (let j = 1; j < copiedWords.length; j++) {
const word = copiedWords[j]
const charIndex = word.indexOf(currentChar)
// যদি অক্ষরটি পাওয়া না যায়, বন্ধ করুন এবং ফ্ল্যাগকে false করুন
if (charIndex === -1) {
isCharCommonAcrossWords = false
break
} else {
// ডুপ্লিকেট হ্যান্ডেল করার জন্য শব্দ থেকে পাওয়া অক্ষরটি সরিয়ে ফেলুন
copiedWords[j] = word.slice(0, charIndex) + word.slice(charIndex + 1)
}
}
// যদি অক্ষরটি সমস্ত শব্দের মধ্যে সাধারণ হয়, তবে এটিকে ফলাফলে যোগ করুন
if (isCharCommonAcrossWords) {
result.push(currentChar)
}
}
return result
}
এই স্নিপেটটি আমাদের পদ্ধতির সারমর্মটি সংক্ষিপ্ত করে, সমস্যা সমাধানের জন্য পঠনযোগ্যতা এবং সহজ সরল লজিককে জোর দেয়।
ঝাঁপিয়ে পড়া: সমাধান পরীক্ষা করা
আমাদের সমাধানটি যাচাই করার জন্য, আমরা বিভিন্ন দৃশ্যপটগুলি কভার করে পরীক্ষার কেসের একটি স্যুট ব্যবহার করেছি - বেসিক কেস থেকে আরও জটিল কেসগুলি যা বিশেষ অক্ষর এবং কেস সংবেদনশীলতা জড়িত। এই পূর্ণ পরীক্ষা নিশ্চিত করেছে যে আমাদের অ্যালগরিদম বিস্তৃত ইনপুটের পরিসরে স্থিতিশীল এবং সঠিক।
স্থান এবং সময় জটিলতা বিশ্লেষণ
প্রতিফলনের পর, আমাদের সমাধানের সময় জটিলতা প্রাথমিকভাবে প্রথম স্ট্রিংয়ের অক্ষরের সংখ্যা দ্বারা নির্ধারিত হয় (চলুন এটিকে N
হিসেবে নির্দেশ করি) এবং স্ট্রিংয়ের মোট সংখ্যা (চলুন এটিকে M
হিসেবে নির্দেশ করি)। প্রথম স্ট্রিংয়ের প্রতিটি অক্ষরের জন্য, আমরা অন্যান্য সমস্ত স্ট্রিং জুড়ে সংশ্লিষ্ট অবস্থানে এর ঘটনা পরীক্ষা করি, যার ফলে O(N\*M)
সময় জটিলতা হয়।
আমাদের সমাধানের স্থান জটিলতা O(N)
, কারণ আমরা সাধারণ অক্ষরগুলি একটি অ্যারেতে সংরক্ষণ করি। সবচেয়ে খারাপ ক্ষেত্রে, যেখানে সমস্ত অক্ষর সমস্ত স্ট্রিং জুড়ে সাধারণ, এই অ্যারের আকার প্রথম স্ট্রিংয়ের দৈর্ঘ্যের সমানুপাতিক হবে।
উন্নতির পথ
যদিও আমাদের সমাধানটি মধ্যম সংখ্যক স্ট্রিং এবং অক্ষরের জন্য কার্যকর, উন্নত করার সর্বদা সুযোগ আছে। এখানে এর পারফর্ম্যান্স আরও উন্নত করার জন্য কয়েকটি কৌশল দেওয়া হল:
প্রাথমিক সমাপ্তি: যদি কোনও সময়ে কোনও অক্ষর সমস্ত স্ট্রিং জুড়ে সংশ্লিষ্ট অবস্থানে মেলে না, আমরা লুপ থেকে প্রাথমিকভাবে বন্ধ করতে পারি, অপ্রয়োজনীয় তুলনা সংরক্ষণ করি।
ছোট স্ট্রিংয়ের জন্য অপ্টিমাইজেশন: রেফারেন্স হিসেবে সবচেয়ে ছোট স্ট্রিং দিয়ে শুরু করা সম্ভবত পুনরাবৃত্তির সংখ্যা কমাতে পারে, কারণ এটি পরীক্ষা করা উচিত সর্বাধিক অক্ষরের সংখ্যা কম করে।
সমান্তরাল প্রক্রিয়াকরণ: বৃহৎ ডেটাসেটের জন্য, স্ট্রিং জুড়ে সমান্তরালভাবে অক্ষরগুলি তুলনা করার জন্য সমান্তরাল প্রক্রিয়াকরণ কৌশলগুলি ব্যবহার করা নির্বাহ সময় উল্লেখযোগ্যভাবে হ্রাস করতে পারে।
হ্যাশিং কৌশল: অক্ষরের অবস্থান এবং ঘটনা ট্র্যাক করার জন্য একটি হ্যাশ ম্যাপ ব্যবহার করা, বিশেষ করে বিস্তৃত স্ট্রিং সেটের সাথে কাজ করার সময়, সাধারণ অক্ষরগুলি সনাক্ত করার জন্য আরও অত্যাধুনিক উপায় প্রদান করতে পারে।
শেষ ভাবনা
সাধারণ অক্ষর চ্যালেঞ্জটি স্ট্রিং ম্যানিপুলেশন সমস্যার সৌন্দর্যের একটি উল্লেখযোগ্য প্রমাণ হিসেবে কাজ করে, ডেভেলপারদের অ্যালগরিদম এবং ডেটা স্ট্রাকচারের সূক্ষ্মতাগুলিতে গভীরভাবে আগ্রহী করে। টাইপস্ক্রিপ্টের মাধ্যমে, আমরা কেবলমাত্র একটি সমাধান খুঁজে পাইনি বরং স্পষ্টতা, টাইপ সুরক্ষা এবং কার্যকর সমস্যা সমাধানের একটি যাত্রাও গ্রহণ করেছি।
যখন আমরা মোড়ানো, এটি মনে রাখা গুরুত্বপূর্ণ যে কোডিং চ্যালেঞ্জগুলির মাধ্যমে যাত্রা করা হলো যে পথটি নেওয়া হয়েছে তার জন্য যেমন গুরুত্বপূর্ণ, তেমনই লক্ষ্যে পৌঁছানোর জন্যও গুরুত্বপূর্ণ। এই সমস্যাটি সহ প্রতিটি সমস্যা, আমাদের দক্ষতা পরিমার্জন করার, আমাদের পদ্ধতিগুলি পুনর্বিবেচনা করার এবং সবচেয়ে গুরুত্বপূর্ণ, শেখা চালিয়ে যাওয়ার একটি অনন্য সুযোগ প্রদান করে।