Câu hỏi FizzBuzz thay thế [đã đóng]


88

Có ai có câu hỏi loại FizzBuzz hay không mà không phải vấn đề của FizzBuzz?

Tôi đang phỏng vấn một người nào đó và FB tương đối nổi tiếng và không khó để ghi nhớ, vì vậy điểm dừng đầu tiên của tôi trong việc tìm kiếm ý tưởng chính là cơn nghiện mới của tôi.

Câu trả lời:


103

Tôi đã thấy một danh sách nhỏ các vấn đề lập trình tương đối đơn giản được sử dụng để loại bỏ các ứng cử viên, giống như FizzBuzz. Đây là một số vấn đề tôi đã gặp, theo thứ tự độ khó ngày càng tăng:

  1. Đảo ngược một chuỗi
  2. Đảo ngược một câu ("bob thích chó" -> "chó thích bob")
  3. Tìm giá trị nhỏ nhất trong danh sách
  4. Tìm giá trị lớn nhất trong danh sách
  5. Tính phần dư (đã cho tử số và mẫu số)
  6. Trả về các giá trị khác biệt từ danh sách bao gồm các bản sao (tức là "1 3 5 3 7 3 1 1 5" -> "1 3 5 7")
  7. Trả về các giá trị khác biệt và số lượng của chúng (tức là danh sách trên trở thành "1 (3) 3 (3) 5 (2) 7 (1)")
  8. Cho một chuỗi biểu thức (chỉ các biến, + và -) và một tập các cặp biến / giá trị (tức là a = 1, b = 7, c = 3, d = 14) trả về kết quả của biểu thức ("a + b + c -d "sẽ là -3).

Chúng dành cho Java và bạn có thể sử dụng các thư viện tiêu chuẩn để một số trong số chúng có thể cực kỳ dễ dàng (như 6). Nhưng chúng hoạt động giống như FizzBuzz. Nếu bạn có manh mối về lập trình, bạn sẽ có thể làm khá nhanh. Ngay cả khi bạn không biết ngôn ngữ tốt, ít nhất bạn cũng có thể đưa ra ý tưởng đằng sau cách thực hiện điều gì đó.

Sử dụng bài kiểm tra này, một trong những ông chủ trước đây của tôi đã thấy mọi thứ, từ những người thành công khá nhanh, đến những người có thể làm khá nhanh, đến một người không thể trả lời một câu nào sau nửa giờ.

Tôi cũng nên lưu ý: anh ấy để mọi người sử dụng máy tính của mình trong khi họ được giao những nhiệm vụ này. Họ được hướng dẫn cụ thể rằng họ có thể sử dụng Google và những thứ tương tự.


Đối với mục 8, giải pháp dựa trên JSR-223 (javax.script) có được chấp nhận không? :-P (Phải thừa nhận rằng việc sử dụng đó là hoàn toàn quá mức cần thiết, nhưng một số người thà làm điều đó hơn sử dụng, chẳng hạn, java.util.Scanner.)
Chris Jester-Young

4
Đó không phải là ý tưởng của tôi về tinh thần của câu hỏi, nhưng nếu bạn biết đủ để đề xuất điều đó, thì bạn chắc chắn biết đủ để vượt qua các câu hỏi của FizzBuzz, vì vậy tôi sẽ không chống lại bạn. Nó thậm chí có thể là một điểm cộng có lợi cho bạn. Tôi vẫn có thể hỏi bạn làm thế nào để làm điều đó mà không có javax.script.
MBCook

3
Tôi đã đọc câu trả lời của bạn trong một thời gian và có thể, không hiểu chuyện gì đang xảy ra, tại sao tôi không thích nó, vấn đề là câu hỏi của bạn không thú vị khi viết mã :) (không sao vì điều này được dự định để phỏng vấn). Không có điểm thực sự cho nhận xét này nhưng chỉ muốn đưa nó ra khỏi hệ thống của tôi. :) xin lỗi vì tất cả các biểu tượng mặt cười
Trufa

1
Muốn xem các giải pháp mẫu cho số 8. Số 7 đầu tiên rất dễ dàng, nhưng số 8 (với tôi) có vẻ phức tạp hơn một chút so với phần còn lại. Tôi đang giải quyết nó bằng Python 3.x và đó là một trò chơi hoàn toàn khác. Có lẽ chỉ là một cái gì đó tôi không biết.
DonutSteve

31

Có lẽ điều này không trả lời trực tiếp câu hỏi của bạn, nhưng tôi không chắc bạn cần phải đưa ra một vấn đề khác. Bên cạnh việc "dễ thuộc", câu hỏi của FizzBuzz chỉ đơn giản là "dễ", và đó là điểm chính. Nếu người mà bạn đang phỏng vấn thuộc hạng người mà FizzBuzz là "nổi tiếng", thì họ thuộc hạng người mà một câu hỏi dạng FizzBuzz sẽ không lọc ra. Điều đó không có nghĩa là bạn thuê họ ngay tại chỗ, nhưng nó có nghĩa là họ sẽ có thể vượt qua nó và bắt đầu cuộc phỏng vấn.

Nói một cách khác, bất kỳ ai dành thời gian đọc Coding Horror đều đáng được phỏng vấn thêm. Chỉ cần yêu cầu họ viết ra giải pháp thực sự nhanh chóng, thảo luận ngắn gọn về nó (ví dụ: Làm thế nào để bạn kiểm tra điều này?), Và sau đó chuyển sang câu hỏi tiếp theo. Và như bài báo viết, "thực sự đáng kinh ngạc là có bao nhiêu ứng viên không có khả năng thực hiện các nhiệm vụ lập trình đơn giản nhất."


7
Câu trả lời chính xác. "FizzBuzz rất dễ dàng và đó là điểm ... bất kỳ ai dành thời gian đọc Coding Horror đều đáng được phỏng vấn thêm" QFT. Tôi thường hỏi các ứng viên "bạn đi đâu để đọc về lập trình?" Tôi luôn ngạc nhiên về việc có bao nhiêu người không thể đề cập đến một blog, trang web hay cuốn sách.
Noah Sussman.

1
Tôi không đồng ý. Chúng tôi đã phỏng vấn ai đó vào tuần trước và chúng tôi đã hỏi họ số 3 từ câu trả lời được chấp nhận. Họ nói theo đúng nghĩa đen là "ồ, tôi đã mong chờ fizzbuzz" và sau đó không thể trả lời câu hỏi của chúng tôi.
frandroid

23

Bất kỳ cái nào đầu tiên từ Project Euler có lẽ sẽ tốt.

Ví dụ:

Bài toán 25

Chuỗi Fibonacci được xác định bằng quan hệ lặp lại:

Fn = Fn−1 + Fn−2, where F1 = 1 and F2 = 1.

Do đó 12 điều khoản đầu tiên sẽ là:

F1 = 1
F2 = 1
F3 = 2
F4 = 3
F5 = 5
F6 = 8
F7 = 13
F8 = 21
F9 = 34
F10 = 55
F11 = 89
F12 = 144

Số hạng thứ 12, F12, là số hạng đầu tiên chứa ba chữ số.

Chỉ số của số hạng đầu tiên trong dãy Fibonacci chứa 1000 chữ số là bao nhiêu?


14

Tôi đã tìm thấy việc kiểm tra một chuỗi nếu nó là một palindrome là một chuỗi khá đơn giản có thể là một loại cỏ tốt.


Tôi muốn nói rằng điều đó phụ thuộc vào ngôn ngữ. Trong C nó có thể là thú vị, trong Perl nó được thực hiện với scalar(reverse 'foo') == 'foo'.
jkramer 22/09/08

3
đúng, nhưng đồng thời, có thể thấy giải pháp đơn giản hơn là có giá trị ... khi đó bạn nói, "ok, bây giờ giả như bạn không có chức năng ngược lại."
Mike Stone

1
Trong C ++, tôi sẽ cho điểm thưởng cho bất kỳ giải pháp "chức năng" nào không liên quan đến vòng lặp viết tay. ví dụ: "trả về bằng (str.begin (), str.end (), str.rbegin ());" hoặc (đối với tốc độ) "trả về bằng (str.begin (), str.begin () + str.size () / 2, str.rbegin ());"
Chris Jester-Young

1
Tất nhiên, khi thấy một câu trả lời như vậy, tôi cũng sẽ yêu cầu ứng viên giải thích hoạt động của mã. Họ không thể có được một chân chỉ bằng cách sao chép câu trả lời của tôi ở trên! :-P
Chris Jester-Young

10

Tôi muốn một câu hỏi FizzBuzz không liên quan đến toán tử modulo. Đặc biệt là vì tôi thường phỏng vấn các nhà phát triển web mà nhà điều hành modulo không thường xuyên xuất hiện. Và nếu nó không phải là thứ bạn gặp thường xuyên, thì đó là một trong những thứ bạn phải tra cứu vài lần bạn cần.

(Đúng là, đó là một khái niệm mà lý tưởng nhất là bạn nên gặp trong một khóa học toán ở đâu đó trên đường đi, nhưng đó là một chủ đề khác.)

Vì vậy, những gì tôi nghĩ ra là cái mà tôi gọi, một cách không tưởng tượng là Threes in Reverse . Hướng dẫn là:

Viết chương trình in ra, theo thứ tự ngược lại , mọi bội số của 3 từ 1 đến 200.

Thực hiện theo thứ tự bình thường, dễ dàng: nhân chỉ số vòng lặp với 3 cho đến khi bạn đạt đến con số vượt quá 200, sau đó bỏ. Bạn không phải lo lắng về việc kết thúc bao nhiêu lần lặp, bạn cứ tiếp tục cho đến khi đạt đến giá trị đầu tiên quá cao.

Nhưng đi ngược lại, bạn phải biết bắt đầu từ đâu. Một số có thể nhận ra bằng trực giác rằng 198 (3 * 66) là bội số cao nhất của 3, và như vậy, mã cứng 66 vào vòng lặp. Những người khác có thể sử dụng một phép toán (phép chia số nguyên hoặc một tầng () trên dấu chấm động chia 200 và 3) để tìm ra con số đó và khi làm như vậy, cung cấp một cái gì đó có thể áp dụng chung hơn.

Về cơ bản, đó là một loại vấn đề giống như FizzBuzz (lặp lại các giá trị và in chúng ra, với một sự thay đổi). Đây là một vấn đề cần giải quyết mà không sử dụng bất cứ thứ gì khá bí truyền (tương đối) như hoạt động modulo.


2
Tôi rất tò mò Legion: làm thế nào để các nhà phát triển web của bạn làm những việc như hàng rào xanh / hàng thay thế mà không có modulo?
Andrew Burns

4
Chà, nếu bạn chỉ đang cố gắng áp dụng kiểu cho các hàng xen kẽ, bằng cách sử dụng bộ chọn con thứ n của CSS3. jQuery cũng có các bộ chọn xen kẽ để thực hiện những việc như vậy thông qua JS. Nhưng nói về quan điểm lớn hơn của bạn, như tôi đã nói ở trên, đó là thứ được tra cứu, sử dụng và sau đó nhanh chóng bị lãng quên vì mất tất cả 15 giây để tìm. Tôi không nói rằng tôi thích hay chấp thuận, nhưng đặc biệt là ở cấp độ đầu vào, điều đó xảy ra. :)
Legion

1
đây là giải pháp php của tôi :) ideone.com/BnJQ3 3 phút :)
Trufa

Nó phải khó hơn trong các ngôn ngữ cấp thấp hơn, bởi vì trong Ruby, nó dễ dàng như việc đẩy các số (theo thứ tự) vào một mảng, sau đó đảo ngược toàn bộ mảng. Ideone.com/MKKb6
Kerrick

Python:print [x for x in xrange(3, 200, 3)][::-1]
beatgammit

8

Fibonacci, đảo ngược một chuỗi, đếm số bit được đặt trong một byte là những thứ phổ biến khác. Project Euler cũng có một bộ sưu tập lớn với độ khó tăng dần.


Fibonaaci, mặc dù một chút cắn cao cấp hơn, là một tốt đẹp, tôi newbie hoàn toàn và nó đã cho tôi 20-25 phút để theres bạn tham khảo :)
Trufa

Tôi bị đánh bằng Fibonacci, FizzBuzz, và loại bỏ nguyên trùng lặp trong một mảng - tất cả các ngày hôm nay trong một cuộc phỏng vấn (4 giờ)
IAbstract

8

Đối với một cái gì đó thực sự siêu đơn giản có thể được thực hiện trong 10 giây, nhưng sẽ loại bỏ những người thực sự không thể lập trình bất cứ thứ gì , hãy thử cái này:

Hỏi: hãy chỉ cho tôi (trên giấy, nhưng tốt hơn trên bảng trắng) cách bạn sẽ hoán đổi giá trị của hai biến.

Đây không phải là ý tưởng của tôi, nhưng đã được đăng trong một bình luận của một người tên Jacob trên một bài đăng blog về câu hỏi ban đầu của FizzBuzz.

Jacob tiếp tục nói:

Nếu họ không bắt đầu với việc tạo biến thứ ba, bạn có thể loại bỏ khá nhiều người đó. Tôi nhận thấy rằng tôi có thể cắt giảm một phần ba đến một nửa số ứng viên (phải thừa nhận là chưa được sàng lọc) chỉ với câu hỏi đó.

Có một cuộc thảo luận thú vị hơn sau nhận xét đó trên bài đăng blog ban đầu về các cách thực hiện hoán đổi biến này mà không yêu cầu biến thứ ba (thêm / trừ, xor, v.v.) và tất nhiên, nếu bạn đang sử dụng ngôn ngữ hỗ trợ điều này trong một câu lệnh / hoạt động duy nhất, nó có thể không phải là một bài kiểm tra tốt như vậy.

Mặc dù không phải ý tưởng của tôi, tôi muốn đăng bài này ở đây vì đây là một câu hỏi đơn giản, trang nhã và dễ dàng có thể (và nên) trả lời trong vòng khoảng 10 giây bởi một người đã viết ngay cả những chương trình đơn giản nhất. Nó cũng không yêu cầu sử dụng các toán tử có vẻ hơi khó hiểu như toán tử modulo, điều mà nhiều người, những lập trình viên khá giỏi, đơn giản là không quen thuộc (mà tôi biết từ kinh nghiệm của mình).


1
Tôi nghĩ đây là một ý kiến ​​rất hay. Nó chắc chắn đánh bại việc ngồi khoảng 20 phút để xem trong khi một ứng viên gỡ lỗi chương trình một cách đau đớn tự hỏi tại sao họ đã sử dụng foreach thay vì for và cách khắc phục nó! (Như tôi vừa thực hiện)
mike nelson

std :: swap (a, b); Tại sao tôi nên tạo biến thứ ba khi mà hầu như mọi thư viện tiêu chuẩn đều sẽ vui vẻ làm điều đó cho tôi?

@Dan - Ý tưởng là bạn được yêu cầu thực hiện việc này mà không cần sử dụng bất kỳ thư viện nào và chỉ sử dụng các từ khóa tích hợp trong ngôn ngữ bạn chọn. Chắc chắn, trong thế giới thực, bạn có thể sử dụng quy trình thư viện để đạt được điều này, giống như sử dụng quy trình thư viện cho (giả sử) cấu trúc danh sách liên kết thay vì viết của riêng bạn. Điểm của bài kiểm tra này là nó đủ đơn giản và không nằm ngoài khả năng mong đợi bất kỳ ứng viên nào cũng có thể làm được mà không cần đến thư viện để đạt được.
CraigTP

Vì vậy, Jacob đề nghị người được phỏng vấn sử dụng biến thứ ba hay không? Tôi đã thấy các lựa chọn thay thế cho câu hỏi đó trong đó nó yêu cầu nhà phát triển không sử dụng biến thứ ba. Cách anh ấy nói câu trả lời của mình khá mơ hồ.
theGreenCabbage,

1
Là một người nghĩ rằng họ chỉ là một lập trình viên "ổn", điều này khiến tôi sợ hãi. Suy nghĩ ngay lập tức của tôi là "Lạy Chúa, tôi sẽ sử dụng biến thứ 3 nhưng chắc chắn anh ấy muốn có một số cách làm thông minh mà không có biến đó!"
Devil's Advocate

4

Yêu cầu họ viết một ứng dụng để trả về các thừa số của một số nhất định. Rất dễ làm và khó để làm tốt trong một khoảng thời gian ngắn. Bạn có thể thấy phong cách của họ và cách họ suy nghĩ về các vấn đề trong một khoảng thời gian nhỏ.


2

Trả về chỉ số của lần xuất hiện đầu tiên của chuỗi X trong chuỗi Y

Việc triển khai strstr () yêu cầu hiểu biết cơ bản về ngôn ngữ đồng thời mang lại cơ hội tối ưu hóa thông minh.


2

Nếu đó là một cuộc phỏng vấn C / C ++, hãy đảm bảo rằng người đó biết về con trỏ.

Tổng quát - thuật toán đơn giản (danh sách liên kết [đơn / kép]). Hỏi về độ phức tạp của việc thêm trong từng trường hợp (lúc bắt đầu, lúc kết thúc, tối ưu hóa ...)?

(Tổng quát) Làm cách nào để tìm giá trị tối thiểu và tối đa từ một mảng (kích thước N) chỉ với 3 * N / 2 so sánh?

C / C ++: Làm thế nào bạn sẽ tối ưu hóa nhiều "strcat" cho một bộ đệm?


Đối với tôi, dường như đối với vấn đề "Làm cách nào để tìm tối thiểu và tối đa từ một mảng (kích thước N) chỉ với 3 * N / 2 so sánh?" rất tốt để làm rõ rằng số 3 * N / 2 là một số so sánh các phần tử của mảng, nhưng bạn có thể so sánh int tự do chẳng hạn. ví dụ: (i <kích thước mảng) trong vòng lặp.
sergtk


0

Làm thế nào về: Tôi muốn sử dụng một số nguyên duy nhất để lưu trữ nhiều giá trị. Mô tả cách thức hoạt động.

Nếu họ không có manh mối về mặt nạ bit và hoạt động, họ có thể không thể giải quyết các vấn đề khác.


9
Tôi sẽ nói rằng nó có tính hướng dẫn hơn nếu sau khi giải thích hoặc chỉ ra mặt nạ, nếu người đó không vỗ trán và lắc đầu tự chế giễu. Bit-mask không phải là một thành ngữ phổ biến, trừ khi một thành ngữ C, thiết bị nhúng hoặc mạng. Rất nhiều tài năng dân gian đã không.
Gregg Lind

2
Hmm, sau đó bạn phải quyết định nếu chấp nhận lưu trữ 1,2 và 3 trong số thập phân 123 được tính là một câu trả lời đúng, mặc dù phép toán sẽ phức tạp hơn so với việc chỉ khai báo 3 biến. Hoặc lưu trữ 1,2,3 bằng cách viết x = 1; x = 2; x = 3; Ý tôi là, chúng ta có cần lưu trữ những giá trị này đồng thời không?
MatthewMartin,

0

Tìm danh sách các số nguyên tố là một câu hỏi khá phổ biến nhưng nó vẫn đòi hỏi một số suy nghĩ và có nhiều mức độ câu trả lời khác nhau mà mọi người có thể đưa ra.

Bạn cũng sẽ ngạc nhiên khi có bao nhiêu người đấu tranh để triển khai cấu trúc dữ liệu kiểu Bản đồ / Từ điển.


0

Tôi đã yêu cầu các ứng viên của mình tạo một chương trình để tính giai thừa của một số nhất định bằng bất kỳ ngôn ngữ giả nào mà họ chọn. Đây là một vấn đề khá dễ giải quyết và nó có lợi cho các câu hỏi tiếp theo tự nhiên (thường có thể được hỏi) về đệ quy.

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.