Xếp hạng câu hỏi phỏng vấn FizzBuzz (1), thực hiện malloc (10) [đã đóng]


10

Tôi muốn có ý kiến ​​của bạn về độ khó của câu hỏi phỏng vấn sau:

Tìm phân đoạn tiếp giáp với tổng tối đa trong một mảng các số nguyên trong thời gian O (n).

Vấn đề âm thanh tầm thường này đã được Jon Bentley nổi tiếng trong chương trình Ngọc trai lập trình của mình, nơi ông sử dụng nó để thể hiện các kỹ thuật thiết kế thuật toán.

Trên thang điểm từ 1-10, 1 là thử nghiệm FizzBuzz (hoặc HoppityHop ) và 10 đang thực hiện hàm C stdlib malloc (), bạn sẽ xếp hạng vấn đề trên như thế nào?

Tôi nghĩ rằng những người có thể trả lời tốt nhất câu hỏi này là những người đã đọc Lập trình Ngọc trai và đã cố gắng tự giải quyết vấn đề này. Để thúc đẩy những người chưa có, 'Ngọc trai lập trình' được nhắc đến nhiều lần trong danh sách '10 cuốn sách lập trình hàng đầu '.

Một vài ý kiến ​​có thể giúp nhận được đánh giá tốt hơn:

  • Việc triển khai malloc () không ghê gớm như vẻ ngoài của nó. Xem Ngôn ngữ lập trình C của K & R chẳng hạn. Nó đôi khi được hỏi tại Microsoft .

  • Quan sát CLRS về giải quyết vấn đề: thường khó giải quyết vấn đề từ đầu hơn là xác minh một giải pháp được trình bày rõ ràng, đặc biệt là khi làm việc trong thời gian hạn chế .


12
Khó khăn ở đây là số nguyên có thể âm? (nếu không thì toàn bộ mảng luôn là phân đoạn lớn nhất, do đó O (1) :-P)
Macke

4
Vấn đề sẽ nói "Tìm phân đoạn tiếp giáp ..."
v64

6
Tôi sẽ không yêu cầu "trong O (n)" trong một cuộc phỏng vấn. Bạn có thể bắt đầu với một giải pháp ngây thơ và sau đó tinh chỉnh nó nếu bạn muốn, nhưng tôi không mong đợi ai đó có thể rút ra giải pháp O (n) trong cuộc phỏng vấn 1 giờ mà không cần tiếp xúc với thuật toán này trước đó.
Dean Harding

2
Đúng. Đây là một vấn đề dễ dàng nếu bạn cho phép các giải pháp O (n²).
dan04

@Dean, tôi hy vọng họ có thể di chuyển tổng loại báo thù đang chạy từ vị trí j sang j + 1 trong O (1). Có lẽ để công bằng, điều đó có thể được cung cấp như một gợi ý. (Tôi giả sử chiều dài của phân đoạn đã được xác định trước)
Omega Centauri

Câu trả lời:


17

Điều đó thực sự phụ thuộc vào nhà phát triển.

Nếu malloc là 10 thì tôi sẽ đánh giá vấn đề này là 20. Nhưng một lần nữa tôi đã thực hiện malloc trước đây và có thể có thể làm lại.

Ai đó đã thực hiện vấn đề này hoặc biết thuật toán thích hợp của đỉnh đầu của họ sẽ biến nó thành 5 và malloc () thành 10.

Vấn đề với loại câu hỏi này là nếu bạn đã thực hiện chúng trước khi chúng dễ dàng và đây thực sự là một thử nghiệm xem bạn đã xem thuật toán này trước đây chưa. Vì vậy, tôi không thích họ cho các cuộc phỏng vấn.

Bây giờ đối với các thử nghiệm mà bạn cung cấp cho nhà phát triển một vài ngày thì đó là một thử nghiệm hoàn toàn tốt bởi vì nếu họ không biết thuật toán thì bạn sẽ cho họ cơ hội thực hiện nghiên cứu và tăng tốc và đó không chỉ là thử nghiệm kiến thức của bạn nhưng khả năng của bạn để có được kiến ​​thức mới.


thời tiết -> cho dù trong đoạn thứ tư (và xin lỗi vì tiếng ồn, tôi không có đại diện để chỉnh sửa lỗi chính tả ...)
Matthieu M.

Martin, tôi nghĩ nó phụ thuộc vào loại ứng dụng mà bạn đang phỏng vấn mọi người. Đối với các loại hệ thống malloc là khá đơn giản. Đối với tôi - tôi bị mắc kẹt, [tôi cho rằng địa chỉ ngăn xếp và độ dài, v.v. đã bị cố tình giấu tôi] với malloc, nhưng vấn đề subarray gần như không đáng kể. Điều quan trọng là phù hợp với các câu hỏi cho nhu cầu của công việc.
Omega Centauri

9

Tôi đoán, ít nhất là đánh giá hai chiều. FizzBuzz- mallocmô tả phạm vi trên một trục, tôi sẽ gọi nó là "độ phức tạp công nghệ". Nhưng kích thước duy nhất này chắc chắn là không đủ để mô tả vấn đề. Để giải quyết vấn đề đang được đề cập, nhà phát triển nên suy nghĩ nhiều hơn mã , trong khi thực hiện mallocđòi hỏi nhiều kỷ luật mã hóa hơn là tạo ra các thuật toán phức tạp.

Vì vậy, đây là cách tôi sắp xếp những vấn đề này:

nhập mô tả hình ảnh ở đây

Để minh họa quan điểm của tôi, tôi đã thêm vào sắp xếp hợp nhất song song vào cốt truyện, vì, tôi đoán, đó là một ví dụ tốt về cả nhiệm vụ phức tạp về công nghệ và thuật toán.


2

Tôi nghĩ nó khó hơn đáng kể so với FizzBuzz hoặc HoppityHop - hai thứ đó không hơn gì một if-other hoặc case-switch đơn giản trong một vòng lặp.

Mảng con tối đa sẽ yêu cầu phân tích sâu hơn về vấn đề tiềm ẩn - đó không phải là điều bạn mong đợi sẽ thấy trong lớp lập trình mới bắt đầu vì nó đòi hỏi các kỹ năng toán học cao hơn so với bài toán kiểu FizzBuzz. Vấn đề này có cảm giác tương tự như vấn đề đường đi ngắn nhất, được giải quyết bằng thuật toán của Dijkstra - có lẽ đó là vấn đề chuyên môn hóa của vấn đề đường đi dài nhất .

Trên thang điểm từ 1 đến 10 của tôi, tôi có thể đánh giá nó trong khoảng từ 3 đến 5.

* Trong khi máy chủ ngừng hoạt động, tôi thấy rằng sự cố subarray tối đa có trang riêng trên wikipedia.


Ai đó có thể giải thích tại sao thuật toán được mô tả trên wikipedia là cần thiết không, khi thuật toán đơn giản hơn nhiều về mặt khái niệm sau đây hoạt động với tôi: Trong một lần vượt qua, hãy tính tổng tích lũy, tìm mức tối thiểu và tối đa theo cách thông thường. Tổng số tối đa liên tiếp bắt đầu sau chỉ số cumsum tối thiểu và mở rộng lên đến và bao gồm chỉ số cumsum tối đa.
Ben Voigt

2
@Ben Voigt: thử chuỗi {+2, -4, +1} hoặc {+1, +1, -1, -1, -1, -1, +1}. Trên thực tế, phương pháp Kadane rất đơn giản - nó chỉ quét mảng một lần và giữ ba biến được cập nhật theo kiểu lập trình dyanmic.
rwong

@rwong: ah ok, Kadane là cần thiết trong trường hợp khi mức tối thiểu đến sau mức tối đa. Và tôi đếm 5 biến chứ không phải 3, cộng với chỉ số vòng lặp.
Ben Voigt

@Ben: bạn nói đúng, đó là 5 biến cộng với chỉ số vòng lặp.
rwong

1

Tôi cho nó điểm 3. Vượt xa hầu hết các lập trình viên mà tôi đã phỏng vấn, nhưng một vấn đề dễ dàng đối với những người tôi khuyên nên thuê.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.