সমস্যা
একটি সংখ্যা অ্যারে দেওয়া আছে যা আরোহী ক্রমে সর্টেড, কিন্তু শুধু একটি উপাদান আউট-অফ-অর্ডার (খারাপ পজিশনে)। সেটি খুঁজে বের করতে হবে।
উদাহরণ কোড
const arr = [1, 2, 3, 4, 17, 5, 6, 7, 8];
const findWrongNumber = (arr = []) => {
for (let i = 0; i < arr.length - 1; i++) {
const el = arr[i];
if (el - arr[i + 1] < 0 && arr[i + 1] - arr[i + 2] > 0) {
return arr[i + 1];
}
}
};
console.log(findWrongNumber(arr));
আউটপুট
17
ব্যাখ্যা (প্রদত্ত কোড)
- লুপ প্রতিটি উপাদানের জন্য চেক করে:
el < arr[i+1](নরমাল) এবংarr[i+1] > arr[i+2](পিক পয়েন্ট)। - যদি বর্তমান উপাদান পরবর্তীটি থেকে ছোট হয় (নরমাল) কিন্তু পরবর্তীটি তারপরের থেকে বড় হয়, তবে
arr[i+1]ही আউট-অফ-অর্ডার। - উদাহরণে: 4 < 17 (OK), কিন্তু 17 > 5 (ব্যাঙ্ক) → ১৭ রিটার্ন।
সীমাবদ্ধতা ও বাগ
arr[i+2]অ্যাক্সেস করার সময় বাউন্ড চেক নেই (শেষ ২টি ইনডেক্সের জন্য ইরর দেবে)।- শুধু "পিক" (peak) ডিটেক্ট করে, "ভ্যালি" (valley) ডিটেক্ট করে না (যেমন: [1, 5, 3, 4, 5] - এখানে ৩ ভ্যালি)।
- প্রথম বা শেষ উপাদান যদি ভুল হয়, তবে ডিটেক্ট করবে না।
রোবাস্ট সমাধান (সব এজ কেস হ্যান্ডল)
const findWrongNumberRobust = (arr) => {
for (let i = 0; i < arr.length - 1; i++) {
if (arr[i] > arr[i + 1]) {
// arr[i] বা arr[i+1] যেকোনো একটি ভুল
// চেক করুন arr[i-1] <= arr[i+1] হলে arr[i] ভুল
if (i === 0 || arr[i - 1] <= arr[i + 1]) {
return arr[i];
}
// অন্যথায় arr[i+1] ভুল
return arr[i + 1];
}
}
return null; // কোনো ভুল নেই
};
console.log(findWrongNumberRobust([1, 2, 3, 4, 17, 5, 6, 7, 8])); // 17
console.log(findWrongNumberRobust([1, 5, 3, 4, 5])); // 5 (ভ্যালি কেস)
console.log(findWrongNumberRobust([10, 2, 3, 4, 5])); // 10 (প্রথম উপাদান)