Created
September 17, 2025 19:46
-
-
Save NantipatSoftEn/8bd9bec530c43a33e029f2865f779672 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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