รวมคำถามปากเปล่า / แบบทดสอบ ในการสัมภาษณ์งานสาย Programming / Data Science ที่น่าสนใจ

รวบรวมจากประสบการณ์ตรง (และอ้อม) นะครับ

  1. ถ้าทอยลูกเต๋าธรรมดา 4 ลูก แล้วตัดแต้มต่ำสุดทิ้งไป ถามว่า expected value ของผลรวมแต้มสามลูกที่เหลือจะเป็นเท่าไร มีวิธีคิดอย่างไร ถ้าจะรัน sample เพื่อหาค่า expected value จะต้องรัน “อย่างน้อยที่สุด” กี่ sample
  2. ถ้าให้ p เป็นจำนวนเฉพาะใด ๆ ที่มากกว่า 5 แล้วจำนวนเต็ม n ที่มากที่สุดที่สามารถหาร (p^n)-1 ได้เสมอ คือเท่าไร
  3. ถ้าไปตรวจมะเร็ง แล้วผลเป็น positive โดยที่ความแม่นยำของการตรวจเป็น 99 % และมะเร็งนี้มีโอกาสเกิดกับประชากรเพียง 1% ถามว่าเราจะมั่นใจได้กี่ % ว่าเราเป็นมะเร็งจริง
  4. จากข้อข้างต้น ถ้าทราบว่า False Positive มีอัตรา 1% ถามว่าหากประชากร 1 แสนคนมาตรวจมะเร็งนี้ คาดว่าจะมีประชากรประมาณกี่คนที่ได้ผลตรวจเป็น positive และกี่คนที่เป็นมะเร็งจริง
  5. ถ้ามีประตูสามบาน โดยมีเพียงประตูเดียวที่เป็นทางออก ถ้าให้เลือก 1 ประตู โดยจากสองประตูที่เหลือนั้น เจ้าหน้าที่จะชี้บอกเราว่าประตูไหนไม่ใช่ทางออกเพียงหนึ่งประตู (แม้ไม่ใช่ทางออกทั้งสองประตู เจ้าหน้าที่ก็จะชี้เพียงประตูเดียว) ทำให้เหลือเพียงประตูที่เราเลือก และประตูที่เจ้าหน้าที่ไม่ได้ชี้ในตัวเลือกตอนนี้ จากนั้นเราจะมีสิทธิ์เลือก 1 ใน 2 ประตูที่เหลืออยู่นั้น ถามว่ามีโอกาสเท่าไรที่สุดท้ายแล้วเราจะเลือกทางออกถูกต้อง
  6. ให้เขียนโปรแกรมที่รับค่าเวลา เป็น hour, minute แล้วคำนวณหามุมที่เข็มยาวกับเข็มสั้นกระทำต่อกัน (เขียนโปรแกรมบนกระดาน ให้เวลา 10 นาที)
  7. ให้เขียนโปรแกรมเรียงค่าใน LinkedList จากน้อยไปมากและจากมากไปน้อย ด้วยการใช้ recursion โดยผลลัพธ์ยังคงเป็น LinkedList(เขียนโปรแกรมบนกระดาน ให้เวลา 15 นาที)
  8. จากโปรแกรมเรียงค่า LinkedList ข้างต้น ให้เขียนใหม่ให้ไม่เกิด tail call recursion ห้ามใช้ลูป(เขียนโปรแกรมบนกระดาน ให้เวลา 15 นาที)
  9. ถ้ามีฟังก์ชัน generater ตัวเลขใน Finite Sequence ที่ไม่ทราบจำนวนสมาชิก ให้ออกแบบฟังก์ชันที่ครอบฟังก์ชัน generator นี้แล้วให้ผลลัพธ์เป็นตัวเลข “สุ่ม” จาก sequence ทั้งชุด โดยที่แต่ละสมาชิกใน sequence มีโอกาสถูกเลือกเท่ากันหมด (uniform) ฟังก์ชันที่ออกแบบต้องรองรับ sequence ขนาดใหญ่เกินกว่าจะเก็บใน memory ทั้งหมดได้ (เขียนโปรแกรมบนกระดาน ให้เวลา 20 นาที)
  10. ถ้ามีคลาสของ LinkedList ที่มีเมธอดดังต่อไปนี้:
    def new() คืนค่าลิสต์เปล่า
    def append(e) คืนค่าลิสต์ใหม่ที่เพิ่มสมาชิกเข้าไป โดยตัวเองไม่เปลี่ยน
    def nohead() คืนค่าลิสต์ใหม่โดยไม่มีสมาชิกตัวแรก
    def head() คืนค่าสมาชิกตัวแรก
    def last() คืนค่าสมาชิกตัวสุดท้าย
    def nolast() คืนค่าลิสต์ใหม่โดยไม่มีสมาชิกตัวสุดท้าย
    def length() คืนค่าจำนวนสมาชิก
    ให้เขียนโปรแกรมที่ reverse list นี้ ห้ามเพิ่มเมธอดของ LinkedList
    (เขียนโปรแกรมบนกระดาน ให้เวลา 15 นาที)
  11. จากข้อข้างต้น ให้เขียนโปรแกรม reverse list โดยใช้ recursion 
    (เขียนโปรแกรมบนกระดาน ให้เวลา 10 นาที)
  12. ให้เขียนโปรแกรมที่รับอินพุธเป็น binary tree แล้วผลลัพธ์เป็น balanced binary tree (เขียนโปรแกรมบนกระดาน ให้เวลา 20 นาที)
  13. จาก complete balanced binary tree ให้เขียนโปรแกรมหาพี่น้องทางขวามือของโหนดใด ๆ ที่ใกล้ที่สุดในระดับชั้นเดียวกัน (Closest right sibling of a node) (เขียนโปรแกรมบนกระดาน ให้เวลา 20 นาที)
  14. ให้เขียนโปรแกรมหาลูป (cycle) ใน Graph ที่ใช้โครงสร้างข้อมูลแบบ Adjacency Matrix (เขียนโปรแกรมบนกระดาน ให้เวลา 10 นาที)