Leet Code
แนะนำ Leet Code
Ref: leetcode.com
LeetCode เป็นแพลตฟอร์มออนไลน์ยอดนิยมที่ให้บริการการฝึกเขียนโปรแกรมและการแก้โจทย์ปัญหาทางอัลกอริทึมและโครงสร้างข้อมูล (Data Structure & Algorithm) โดยมีโจทย์ ปัญหามากมายที่แบ่งออกเป็นระดับความยากง่ายตั้งแต่ระดับเบื้องต้น (Easy) ไปจนถึงระดับยาก (Hard)
LeetCode ได้รับความนิยมเป็นอย่างมากในหมู่ผู้ที่เตรียมตัวสำหรับการสัมภาษณ์งานในตำแหน่งที่เกี่ยวข้องกับการพัฒนาซอฟต์แวร์ (Software Engineering) โดยเฉพาะในบริษัทเทคโนโลยีชั้นนำ (เช่น Google, Facebook, Amazon) เนื่องจากโจทย์ปัญหาบน LeetCode มักเป็นลักษณะเดียวกับคำถามที่ใช้ในการสัมภาษณ์
คุณสมบัติหลักของ LeetCode:
- โจทย์ปัญหา (Problems): LeetCode มีโจทย์ปัญหาหลายพันข้อที่ครอบคลุมหัวข้อต่าง ๆ เช่น อาร์เรย์ (Array), String, Linked List, Tree, Graph, และอื่น ๆ แต่ละข้อจะมีคำอธิบายปัญหา ตัวอย่างผลลัพธ์ และข้อกำหนดที่ชัดเจน
- การฝึกซ้อมสัมภาษณ์ (Interview Preparation): LeetCode มีส่วนสำหรับการฝึกซ้อมสัมภาษณ์ที่เรียกว่า "LeetCode Interview" ซึ่งช่วยให้ผู้ใช้สามารถสร้างสภาพแวดล้อมการสัมภาษณ์จำลองเพื่อทดสอบทักษะการแก้ปัญหาของตนเอง
- การแข่งขัน (Contests): LeetCode จัดการแข่งขันออนไลน์เป็นประจำซึ่งผู้ใช้สามารถเข้าร่วมเพื่อแข่งขันกันแก้โจทย์ปัญหาภายในเวลาที่กำหนด
- บทสนทนาและการแลกเปลี่ยนความรู้ (Discuss & Solutions): LeetCode มีฟอรัมที่ให้ผู้ใช้สามารถพูดคุย แลกเปลี่ยนวิธีการแก้ปัญหา หรือสอบถามข้อสงสัยเกี่ยวกับโจทย์ปัญหาต่าง ๆ
- สนับสนุนหลายภาษาโปรแกรม (Programming Languages): LeetCode รองรับหลายภาษาโปรแกรม เช่น Python, Java, C++, JavaScript ซึ่งช่วยให้ผู้ใช้สามารถแก้โจทย์ปัญหาด้วยภาษาที่ตนเองถนัด
ตัวอย่างการใช้งาน
-
ให้ทุกคนลอง login เข้า leetcode.com
-
จากนั้นให้เข้ามายังหน้า https://leetcode.com/problemset/ จะเจอโจทย์ปัญหามากมายอยู่ในหน้านี้
-
กดตรง Difficulty เพื่อเรียงจากง่ายไปหายากแทน
-
และทุกคนสามารถฝึกฝนจากการลองไล่ทำโจทย์จากง่ายไปหายากได้เลย
ตัวอย่าง Leet Code - Two Sum
https://leetcode.com/problems/two-sum/description/
สิ่งแรกที่ทุกคนเข้ามาในหน้าโจทย์จะเจอหน้าตาแบบนี้
- ฝั่งซ้าย คือ โจทย์ของข้อนั้นที่เราจะต้องแก้ปัญหา
- ฝั่งขวา คือ ส่วนของการ submit code และ case ที่เราสามารถทำการทดสอบได้
ตอนที่เข้ามาครั้งแรก ส่วนใหญ่จะเจอว่า default ภาษา อาจจะเป็น programming ภาษาอื่น ให้เลือกเปลี่ยนเป็น python แทน จากตรงตำแหน่ง Code ได้
เมื่อเปลี่ยนเป็นภาษา python เราก็เจอ function แบบฉบับของ python ออกมา (class Solution ละไว้ในฐานที่เข้าใจก่อนได้ ให้สังเกตแค่ตรง def twoSum()
ที่เป็น function ของการตอบก่อน
สิ่งที่เราจะต้องทำกับ Leet Code คือ
- เราจะต้องเขียน program โดยนำค่าที่ program Leet code (ที่ใส่ไว้เป็น parameter) ส่งเข้ามาผ่าน Control Structure บางอย่าง ใน code
- และท้ายที่สุด ผลลัพธ์ของการทำงานทั้งหมด ให้เราคืนกลับไปผ่าน return function เพื่อให้ Leet code นำไปตรวจสอบได้
ตัวอย่างการส่งใน Leet Code เช่น
จาก 3 ตัวอย่างของโจทย์นี้คือ จะมี Example Input, Output มาให้
- Example Input คื อ ค่าที่ Leet Code จะทำการส่งมาใน function เช่น
- ถ้าเป็นเคส Example 1 = ก็จะเหมือนเรียกใช้ function แบบนี้
twoSum([2,7,11,15], 9)
- ถ้าเป็นเคส Example 2 = ก็จะเหมือนเรียกใช้ function แบบนี้
twoSum([3,2,4], 6)
- ถ้าเป็นเคส Example 3 = ก็จะเหมือนเรียกใช้ function แบบนี้
twoSum([3,3], 6)
- ถ้าเป็นเคส Example 1 = ก็จะเหมือนเรียกใช้ function แบบนี้
- ส่วน Output คือสิ่งที่โจทย์คาดหวังให้ return ออกมาเป็นค่านั้น เช่น
-
Example 1
twoSum([2,7,11,15], 9)
ควรจะ return ค่าออกมาเป็น[0, 1]
-
Example 2
twoSum([3,2,4], 6)
ควรจะ return ค่าออกมาเป็น[1, 2]
-
Example 3
twoSum([3,3], 6)
ควรจะ return ค่าออกมาเป็น[0, 1]
-
ซึ่ง Leet code เองก็ได้เตรียมวิธีทดสอบ case ไว้ตรงตำแหน่งขวาล่างแล้ว เราสามารถลองกดทดสอบเคสดูได้
- สมมุติ (ตามภาพด้านล่าง) ผมลองให้ code python return
[0, 1]
ออกมาตรงๆ ก็จะเจอว่า เราสามารถทำให้ Case 1 ผ่านได้ (แต่ก็จะไม่ผ่าน case 2 แทน) ก็จะยังส่งผลทำให้ภาพรวม เป็นคำตอบที่ผิด (Wrong Answer) ออกมา
โจทย์ของ Leet Code มีอยู่ว่า
- เราจะต้องเขียน program เพื่อให้ผ่าน ทุก case ที่ Leet Code มีในโจทย์นั้นๆออกมาให้ได้ (ไม่ใช่แค่เฉพาะ 3 เคสตัวอย่างนะ แต่ Leet Code จะมีเคสอื่นๆที่ซ่อนไว้อยู่ เพื่อเป็นการ challenge ผู้เล่นในเคสที่มองไม่เห็นด้วย)
โดยเราจะต้องกลับมาวิเคราะห์ผ่าน Problem ที่โจทย์กำหนดไว้ตรงด้านซ้ายบน เพื่อเขียน code ออกมา
อย่าง โจทย์ปัญหานี้ Two Sum
- คำอธิบายปัญหา:
- ให้กำหนดลำดับของตัวเลข (array) ที่ประกอบไปด้วยตัวเลขจำนวนเต็ม (integers) และกำหนดค่าเป้าหมาย (target)
- ให้เราหา index ของตัวเลขสองตัวใน array ที่เมื่อนำมาบวกกันแล้วจะได้ผลลัพธ์เท่ากับค่าเป้าหมาย (target)
- เราต้องคืนค่า index ของตัวเลขสองตัวนั้นเป็นลำดับ (array) ที่ประกอบด้วยดัชนีทั้งสอง
- เราสามารถสมมติได้ว่ามีเพียงวิธีแก้ปัญหาเดียว และไม่สาม ารถใช้ตัวเลขเดียวกันสองครั้งได้
- ข้อกำหนด:
- เราสามารถคืนค่าดัชนีในลำดับใดก็ได้
- ลำดับของตัวเลข (array) และค่าเป้าหมาย (target) จะถูกให้มาเป็น input
- แนวคิด
- ใช้การวนลูปซ้อน (
nested loop
) เพื่อหาคู่ตัวเลขใน array ที่เมื่อรวมกันแล้วได้ค่าเป้าหมาย (target
). - ลูปแรกวนเพื่อเลือกตัวเลขตัวแรกจาก array.
- ลูปที่สองวนเพื่อเลือกตัวเลขถัดมาจาก array ที่อยู่ถัดจากตัวเลขที่เลือกในลูปแรก.
- ถ้าผลรวมของตัวเลขสองตัวเท่ากับค่าเป้าหมาย จะคืนค่าดัชนีของตัวเลขสองตัวนั้น
- ใช้การวนลูปซ้อน (
python code
def two_sum(nums, target):
# วนลูปผ่านตัวเลขใน array เพื่อเลือกตัวเลขตัวแรก
for i in range(len(nums)):
# วนลูปผ่านตัวเลขถัดมาจากตัวเลขที่เลือกในลูปแรก
for j in range(i + 1, len(nums)):
# ตรวจสอบว่าผลรวมของตัวเลขสองตัวเท่ากับค่าเป้าหมายหรือไม่
if nums[i] + nums[j] == target:
return [i, j]
# ตัวอย่างการใช้งาน
nums = [2, 7, 11, 15]
target = 9
result = two_sum(nums, target)
print(result) # ผลลัพธ์ที่ได้คือ [0, 1]
คำอธิบาย code
- ลูปแรก (
for i in range(len(nums))
) ใช้ในการเลือกตัวเลขตัวแรกจาก array. - ลูปที่สอง (
for j in range(i + 1, len(nums))
) ใช้ในการเลือกตัวเลขตัวที่สอง โดยเริ่มจากตัวเลขที่อยู่ถัดจากตัวแรก. - ในแต่ละการวนลูป ตรวจสอบว่าผลรวมของ
nums[i] + nums[j]
เท่ากับค่าเป้าหมาย (target
) หรือไม่. - ถ้าใช่, คืนค่าดัชนี
[i, j]
ของตัวเลขทั้งสอง.
โดยส่วน code นี้ เราสามารถนำมาลอง run บนเครื่องของเรา และลองดูผลลัพธ์จากเครื่องของเราก่อน ตามเคสตัวอย่างได้
เมื่อทุกอย่าง ผลลัพธ์ตรงกับ Example ให้นำ code ชุดนั้น ไปวางไว้ใน Leet Code
- ทดสอบก่อนโดยการกด Run ดูว่า เราวางถูกต้องหรือไม่ และเคสตัวอย่างผ่านหรือไม่ (ถ้าผ่าน = ต้องแสดงเป็น Accepted ด้านขวาล่าง หลังจากที่เรากด Run แล้ว)
- เมื่อทุกอย่างเรียบร้อย ให้กด Submit เพื่อดำเนินการส่ง code
หากทุกเคสผ่านอย่างถูกต้อง จะแสดงเป็นหน้า Accepted ออกมา = ผ่านข้อนี้เรียบร้อยย
เราฝึกฝน Leet Code ไปทำไม ?
การฝึกฝน LeetCode มีประโยชน์หลายประการ โดยเฉพาะอย่างยิ่งสำหรับผู้ที่สนใจในสายงานการพัฒนาซอฟต์แวร์และการแก้ปัญหาเชิงอัลกอริทึมและโครงสร้างข้อมูล นี่คือเหตุผลหลักที่คุณควรฝึกฝน LeetCode
-
เตรียมตัวสำหรับการสัมภาษณ์งานในบริษัทเทคโนโลยี
-
พัฒนาทักษะการเขียนโปรแกรม (Programming Skill)
-
เสริมสร้างความสามารถในการแก้ปัญหา ทำให้เราคิดทุกอย่างออกมาเป็นระบบไ ด้
-
เรียนรู้เรื่องของ Data Structure เพิ่มเติมได้ผ่านการฝึกฝน