Skip to content

Instantly share code, notes, and snippets.

@NantipatSoftEn
Created September 17, 2025 19:46
Show Gist options
  • Select an option

  • Save NantipatSoftEn/8bd9bec530c43a33e029f2865f779672 to your computer and use it in GitHub Desktop.

Select an option

Save NantipatSoftEn/8bd9bec530c43a33e029f2865f779672 to your computer and use it in GitHub Desktop.
const isValidMeeting = (meeting) => {
// ตรวจสอบว่า meeting เป็น object และไม่ใช่ null
if (!meeting || typeof meeting !== 'object' || Array.isArray(meeting)) {
return false;
}
// ตรวจสอบว่ามี start_time และ end_time
if (!('start_time' in meeting) || !('end_time' in meeting)) {
return false;
}
const startTime = meeting.start_time;
const endTime = meeting.end_time;
// ตรวจสอบว่าเป็นตัวเลขและไม่ใช่ NaN
if (typeof startTime !== 'number' || typeof endTime !== 'number' ||
isNaN(startTime) || isNaN(endTime)) {
return false;
}
// ตรวจสอบว่าไม่ใช่ Infinity
if (!isFinite(startTime) || !isFinite(endTime)) {
return false;
}
// ตรวจสอบว่า start_time <= end_time
return startTime <= endTime;
};
/**
* รวมช่วงเวลาประชุมที่ซ้อนทับหรือชิดติดกัน
* @param {Array} meetings - อาร์เรย์ของการประชุม ที่มี start_time และ end_time
* @returns {Array} อาร์เรย์ของช่วงเวลาที่ถูกรวมแล้ว ในรูปแบบ [start_time, end_time]
*/
const mergeMeetingTimes = (meetings) => {
// ถ้าไม่มีการประชุม
if (!Array.isArray(meetings) || meetings.length === 0) {
return [];
}
// กรองเฉพาะการประชุมที่มีข้อมูลถูกต้อง
const validMeetings = meetings.filter(isValidMeeting);
// ถ้าไม่มีการประชุมที่ถูกต้อง
if (validMeetings.length === 0) {
return [];
}
const sortedMeetings = [...validMeetings].sort((a, b) => a.start_time - b.start_time);
// เริ่มต้นด้วยการประชุมแรก
const mergedMeetings = [];
let currentMeetingStart = sortedMeetings[0].start_time;
let currentMeetingEnd = sortedMeetings[0].end_time;
// วนตรวจสอบการประชุมถัดไป
for (let i = 1; i < sortedMeetings.length; i++) {
const nextMeeting = sortedMeetings[i];
const nextMeetingStart = nextMeeting.start_time;
const nextMeetingEnd = nextMeeting.end_time;
// ตรวจสอบว่าการประชุมใหม่ซ้อนทับหรือชิดติดกับการประชุมปัจจุบันหรือไม่
const canMergeMeetings = nextMeetingStart <= currentMeetingEnd;
if (canMergeMeetings) {
// รวมการประชุม: ขยายเวลาสิ้นสุดให้ยาวที่สุด
currentMeetingEnd = Math.max(currentMeetingEnd, nextMeetingEnd);
} else {
// การประชุมแยกกัน: บันทึกการประชุมปัจจุบันแล้วเริ่มการประชุมใหม่
mergedMeetings.push([currentMeetingStart, currentMeetingEnd]);
currentMeetingStart = nextMeetingStart;
currentMeetingEnd = nextMeetingEnd;
}
}
// บันทึกการประชุมสุดท้าย
mergedMeetings.push([currentMeetingStart, currentMeetingEnd]);
return mergedMeetings;
};
// Test case 1: การประชุมที่ชิดติดกัน (adjacent meetings)
const meetingsCase1 = [
{ start_time: 1, end_time: 2 },
{ start_time: 2, end_time: 3 },
];
// Test case 2: การประชุมที่ซ้อนทับและแยกกัน (overlapping and separate meetings)
const meetingsCase2 = [
{ start_time: 0, end_time: 1 },
{ start_time: 3, end_time: 5 },
{ start_time: 4, end_time: 8 },
{ start_time: 10, end_time: 12 },
{ start_time: 9, end_time: 10 },
];
// Test case 3: การประชุมที่ซ้อนทับกันหลายช่วง (multiple overlapping intervals)
const meetingsCase3 = [
{ start_time: 1, end_time: 3 },
{ start_time: 2, end_time: 6 },
{ start_time: 8, end_time: 10 },
{ start_time: 15, end_time: 18 },
];
// Test case 4: ช่วงเวลาที่อยู่ในช่วงเวลาอื่น (intervals with complete containment)
const meetingsCase4 = [
{ start_time: 1, end_time: 8 },
{ start_time: 2, end_time: 5 },
];
// Test case 5: การประชุมที่ไม่เรียงลำดับ (unsorted intervals)
const meetingsCase5 = [
{ start_time: 6, end_time: 7 },
{ start_time: 1, end_time: 4 },
];
// Test case 6: การประชุมที่ไม่ซ้อนทับ (no overlap)
const meetingsCase6 = [
{ start_time: 1, end_time: 2 },
{ start_time: 3, end_time: 4 },
{ start_time: 5, end_time: 6 },
];
// Test case 7: อินพุตว่าง (empty input)
const meetingsCase7 = [];
// Test case 8: การประชุมเดียว (single interval)
const meetingsCase8 = [
{ start_time: 1, end_time: 5 },
];
// Test case 9: การประชุมที่มีเวลาเริ่มต้นและสิ้นสุดเดียวกัน (intervals with same start and end)
const meetingsCase9 = [
{ start_time: 1, end_time: 3 },
{ start_time: 1, end_time: 3 },
{ start_time: 2, end_time: 4 },
];
// Test case 10: ตัวเลขติดลบ (negative numbers)
const meetingsCase10 = [
{ start_time: -2, end_time: -1 }, // ถ้า 1 คือเวลา 9.00 , -2 คือ 8.00
{ start_time: -1, end_time: 0 },
{ start_time: 0, end_time: 2 },
];
// Test case 11: ตัวเลขใหญ่ (large numbers)
const meetingsCase11 = [
{ start_time: 1000000000, end_time: 2000000000 },
{ start_time: 1500000000, end_time: 2500000000 },
];
console.log('Test Case 1:', mergeMeetingTimes(meetingsCase1)); // Expected: [[1, 3]]
console.log('Test Case 2:', mergeMeetingTimes(meetingsCase2)); // Expected: [[0, 1], [3, 8], [9, 12]]
console.log('Test Case 3:', mergeMeetingTimes(meetingsCase3)); // Expected: [[1, 6], [8, 10], [15, 18]]
console.log('Test Case 4:', mergeMeetingTimes(meetingsCase4)); // Expected: [[1, 8]]
console.log('Test Case 5:', mergeMeetingTimes(meetingsCase5)); // Expected: [[1, 4], [6, 7]]
console.log('Test Case 6:', mergeMeetingTimes(meetingsCase6)); // Expected: [[1, 2], [3, 4], [5, 6]]
console.log('Test Case 7:', mergeMeetingTimes(meetingsCase7)); // Expected: []
console.log('Test Case 8:', mergeMeetingTimes(meetingsCase8)); // Expected: [[1, 5]]
console.log('Test Case 9:', mergeMeetingTimes(meetingsCase9)); // Expected: [[1, 4]] // Test Case 10: [[-2, 2]]
console.log('Test Case 10:', mergeMeetingTimes(meetingsCase10)); // Expected: [[-2, 2]]
console.log('Test Case 11:', mergeMeetingTimes(meetingsCase11)); // Expected: [[1000000000, 2500000000]]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment