สัมภาษณ์การจัดอันดับคำถาม FizzBuzz (1) การใช้ malloc (10) [ปิด]


10

ฉันต้องการให้ความเห็นเกี่ยวกับความยากของคำถามสัมภาษณ์ต่อไปนี้:

ค้นหา subarray ต่อเนื่องพร้อมผลรวมสูงสุดในอาร์เรย์จำนวนเต็มในเวลา O (n)

ปัญหาที่ทำให้เกิดเสียงเล็กน้อยนี้ได้รับชื่อเสียงจาก Jon Bentley ใน Programming Pearls ซึ่งเขาใช้มันเพื่อสาธิตเทคนิคการออกแบบอัลกอริทึม

ในระดับ 1-10, 1 คือการทดสอบFizzBuzz (หรือHoppityHop ) และ 10 การใช้งานฟังก์ชั่น C stdlib malloc () คุณจะจัดอันดับปัญหาข้างต้นอย่างไร

ฉันคิดว่าผู้ที่สามารถตอบคำถามนี้ได้ดีที่สุดคือผู้ที่อ่านการเขียนโปรแกรม Pearls และพยายามแก้ไขปัญหานี้ด้วยตนเอง เพื่อกระตุ้นให้ผู้ที่ไม่มี 'Programming Pearls' ได้รับการแนะนำหลายครั้งในรายการ '10 อันดับหนังสือโปรแกรม'

ความคิดเห็นสองข้ออาจช่วยให้ได้คะแนนที่ดีขึ้น:

  • การใช้ malloc () ไม่น่ากลัวเท่าที่ควร ดูตัวอย่างการเขียนโปรแกรมภาษา C ของ K&R บางครั้งมันก็จะได้รับการถามไมโครซอฟท์

  • CLRSสังเกตเกี่ยวกับการแก้ปัญหา: ก็มักจะเป็นเรื่องที่ยากมากในการแก้ปัญหาจากรอยขีดข่วนมากกว่าที่จะตรวจสอบการแก้ปัญหาที่นำเสนออย่างชัดเจนโดยเฉพาะอย่างยิ่งเมื่อการทำงานภายใต้ข้อ จำกัด ด้านเวลา


12
ความยากของการเป็นจำนวนเต็มอาจเป็นค่าลบได้หรือไม่ (ไม่เช่นนั้นอาร์เรย์ทั้งหมดจะเป็น subarray ที่ใหญ่ที่สุดเสมอดังนั้น O (1) :-P)
Macke

4
ปัญหาควรพูดว่า "Find the subarray ที่ต่อเนื่องกัน ... "
v64

6
ฉันไม่ต้องการ "in O (n)" ในการสัมภาษณ์ คุณสามารถเริ่มต้นด้วยวิธีแก้ปัญหาที่ไร้เดียงสาแล้วปรับแก้หากคุณต้องการ แต่ฉันไม่คาดหวังให้ใครบางคนสามารถหาคำตอบ O (n) ในการสัมภาษณ์ 1 ชั่วโมงโดยไม่ต้องเปิดเผยอัลกอริธึมก่อนหน้านี้
Dean Harding

2
ขวา. นี่เป็นปัญหาที่ง่ายถ้าคุณอนุญาตการแก้ไข O (n²)
dan04

@Dean ฉันหวังว่าพวกเขาจะสามารถย้ายผลรวมประเภท aveerage ที่ทำงานอยู่จากตำแหน่ง j ถึง j + 1 ใน O (1) อาจจะยุติธรรมที่สามารถให้เป็นคำใบ้ (ฉันสมมติว่าความยาวของ subarray ได้ถูกกำหนดไว้ล่วงหน้าแล้ว)
Omega Centauri

คำตอบ:


17

นั่นขึ้นอยู่กับนักพัฒนา

ถ้า malloc เท่ากับ 10 ฉันจะให้คะแนนปัญหานี้เป็น 20 แต่แล้วอีกครั้งฉันได้ทำ malloc มาก่อนและอาจทำได้อีกครั้ง

ใครบางคนที่ทำปัญหานี้หรือรู้ว่าอัลกอริทึมที่เหมาะสมของส่วนหัวของพวกเขาจะทำให้มันเป็น 5 และ malloc () a 10

ปัญหาของคำถามประเภทนี้คือถ้าคุณทำเสร็จก่อนง่าย ๆ และนี่เป็นการทดสอบว่าคุณเคยเห็นอัลกอริทึมนี้มาก่อนหรือไม่ ดังนั้นฉันไม่ชอบพวกเขาสำหรับการสัมภาษณ์

ตอนนี้สำหรับการทดสอบที่คุณให้นักพัฒนาสองสามวันมันเป็นการทดสอบที่ดีอย่างสมบูรณ์แบบเพราะหากพวกเขาไม่ทราบอัลกอริทึมคุณก็ให้พวกเขามีโอกาสทำวิจัยและรับความเร็วสูงและเป็นการทดสอบที่ไม่เพียง ความรู้ของคุณ แต่ความสามารถของคุณที่จะได้รับความรู้ใหม่


สภาพอากาศ -> ไม่ว่าจะในย่อหน้าที่สี่ (และขออภัยสำหรับเสียงรบกวนฉันไม่มีตัวแทนในการแก้ไขการพิมพ์ผิด ... )
Matthieu M.

มาร์ตินฉันคิดว่ามันขึ้นอยู่กับประเภทของการสมัครที่คุณสัมภาษณ์คน สำหรับระบบประเภท malloc นั้นค่อนข้างเรียบง่าย สำหรับฉัน - ฉันติดอยู่ (ฉันคิดว่าที่อยู่และความยาวของสแต็ก ฯลฯ ถูกซ่อนไว้อย่างจงใจจากฉัน] ด้วย malloc แต่ปัญหา subarray นั้นแทบจะไม่สำคัญ กุญแจสำคัญคือการจับคู่คำถามกับความต้องการของงาน
Omega Centauri

8

ฉันเดาว่าอันดับควรเป็นสองมิติอย่างน้อย FizzBuzz- mallocอธิบายช่วงของแกนเดียวฉันจะเรียกมันว่า "ความซับซ้อนทางเทคโนโลยี" แต่มิติเดียวนี้ไม่เพียงพอที่จะอธิบายปัญหา เพื่อแก้ปัญหาที่เป็นปัญหานักพัฒนาควรคิดมากกว่ารหัสในขณะที่การใช้mallocต้องมีวินัยในการเข้ารหัสมากกว่าการสร้างอัลกอริทึมที่ซับซ้อน

ดังนั้นนี่คือวิธีที่ฉันจัดการปัญหาเหล่านี้:

ป้อนคำอธิบายรูปภาพที่นี่

เพื่อแสดงจุดของฉันฉันได้เพิ่มการเรียงลำดับการผสานแบบขนานในพล็อตเนื่องจากฉันเดาว่ามันเป็นตัวอย่างที่ดีของงานที่ซับซ้อนทั้งด้านเทคโนโลยีและอัลกอริทึม


2

ฉันคิดว่ามันยากกว่า FizzBuzz หรือ HoppityHop มาก - ทั้งสองนั้นไม่ได้เป็นอะไรที่ง่ายไปกว่า if-else หรือ switch-case ในลูป

กลุ่มย่อยสูงสุดจะต้องวิเคราะห์ปัญหาที่ลึกซึ้งกว่า - ไม่ใช่สิ่งที่คุณคาดว่าจะเห็นในคลาสการเขียนโปรแกรมเริ่มต้นเนื่องจากต้องการทักษะทางคณิตศาสตร์ที่สูงกว่าปัญหาประเภท FizzBuzz ปัญหานี้มีความรู้สึกคล้ายกับปัญหาเส้นทางที่สั้นที่สุดที่จะแก้ไขได้โดยอัลกอริทึมของ Dijkstra - บางทีมันอาจจะเป็นความเชี่ยวชาญของปัญหาเส้นทางที่ยาวที่สุด

ในระดับ 1 ถึง 10 ฉันอาจให้คะแนนระหว่าง 3 ถึง 5

* ในขณะที่เซิร์ฟเวอร์ล่มฉันพบว่าปัญหา subarray สูงสุดมีหน้าของตัวเองในวิกิพีเดีย


บางคนสามารถอธิบายได้ไหมว่าทำไมต้องใช้อัลกอริทึมที่อธิบายไว้ในวิกิพีเดียเมื่ออัลกอริทึมที่เรียบง่ายกว่านี้เป็นแนวคิดสำหรับฉัน: ในการผ่านครั้งเดียวให้คำนวณผลรวมสะสมเพื่อหาค่าต่ำสุดและสูงสุด ผลรวมลำดับสูงสุดต่อเนื่องเริ่มต้นหลังจากดัชนี cumsum ขั้นต่ำและขยายจนถึงและรวมถึงดัชนี cumsum สูงสุด
Ben Voigt

2
@Ben Voigt: ลองใช้ลำดับ {+2, -4, +1} หรือ {+1, +1, -1, -1, -1, -1, -1, +1} ที่จริงแล้ววิธี Kadane นั้นง่ายมาก - มันจะสแกนอาร์เรย์เพียงครั้งเดียวและทำการปรับปรุงตัวแปรสามตัวในรูปแบบของการเขียนโปรแกรม dyanmic

@rwong: โอ้ตกลง Kadane เป็นสิ่งจำเป็นในกรณีที่ขั้นต่ำมาหลังจากสูงสุด และฉันนับตัวแปร 5 ตัวไม่ใช่ 3 บวกกับดัชนีลูป
Ben Voigt

@Ben: ถูกต้องมันคือ 5 ตัวแปรบวกกับดัชนีลูป

1

ฉันให้มัน 3 นอกเหนือจากโปรแกรมเมอร์ส่วนใหญ่ที่ฉันได้สัมภาษณ์ แต่ปัญหาง่าย ๆ สำหรับผู้ที่ฉันแนะนำให้เช่า

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.