সমস্যা
একটি স্ট্রিং দেওয়া আছে। স্ট্রিংয়ে সবচেয়ে বেশি বার কমsekutিভ (consecutive) রিপিট হওয়া ক্যারেক্টারটি এবং তার কাউন্ট রিটার্ন করতে হবে। আউটপুট হবে দুটি উপাদানের অ্যারে: [ক্যারেক্টার, কাউন্ট]।
উদাহরণ কোড
const str = 'tdfdffddffsdsfffffsdsdsddddd';
const findConsecutiveCount = (str = '') => {
let res = '';
let count = 1;
let arr = [];
for (let i = 0; i < str.length; i++) {
if (str[i] === str[i + 1]) {
count++;
} else {
if (arr.every(v => v < count)) {
res = str[i] + count;
}
arr.push(count);
count = 1;
}
}
return !res ? ['', 0] : [res.slice(0, 1), res.slice(1) * 1];
};
console.log(findConsecutiveCount(str));
আউটপুট
['f', 5]
ব্যাখ্যা (প্রদত্ত কোড)
count- বর্তমান ক্যারেক্টার কমsekutিভ কতবার রিপিট হয়েছে।arr- সব গোষ্ঠীর কাউন্ট স্টোর করে।arr.every(v => v < count)- বর্তমান কাউন্ট যদি সবগুলো পূর্বের কাউন্টের চেয়ে বড় হয়, তবেresআপডেট।resফরম্যাট: "f5" (ক্যারেক্টার + কাউন্ট)। শেষে পার্স করে আলাদা করা হয়।
স্পষ্টতর ও সঠিক সংস্করণ
প্রদত্ত কোডে কিছু লজিক্যাল সমস্যা আছে (যেমন: শেষ গোষ্ঠী হ্যান্ডলিং, টাই ব্রেকিং)। নিচে উন্নত সংস্করণ:
const findMaxConsecutive = (str) => {
if (!str) return ['', 0];
let maxChar = str[0];
let maxCount = 1;
let currentChar = str[0];
let currentCount = 1;
for (let i = 1; i < str.length; i++) {
if (str[i] === currentChar) {
currentCount++;
} else {
if (currentCount > maxCount) {
maxCount = currentCount;
maxChar = currentChar;
}
currentChar = str[i];
currentCount = 1;
}
}
// শেষ গোষ্ঠী চেক
if (currentCount > maxCount) {
maxCount = currentCount;
maxChar = currentChar;
}
return [maxChar, maxCount];
};
console.log(findMaxConsecutive('tdfdffddffsdsfffffsdsdsddddd')); // ['f', 5]
console.log(findMaxConsecutive('aaabbb')); // ['a', 3] (প্রথমটি জিতেছে)
console.log(findMaxConsecutive('')); // ['', 0]
ফাংশনাল অ্যাপ্রোচ (Regex + Reduce)
const findMaxConsecutiveFunctional = (str) => {
const groups = str.match(/(.)\1*/g) || []; // ['t', 'd', 'f', 'dd', 'ff', ...]
return groups.reduce((max, group) =>
group.length > max[1] ? [group[0], group.length] : max
, ['', 0]);
};