2013-07-12 62 views
5

Ở đây mỗi hàng có chứa một biểu diễn bit của một số. Các số này đến từ 1..NChúng chính xác một số bị thiếu.Tìm thấy biểu diễn bit của số bị thiếu.
Người phỏng vấn đã hỏi tôi câu hỏi này.
Tôi đã nói: "Chúng tôi có thể tìm tổng của các số đã cho và trừ nó khỏi tổng số n đầu tiên (chúng tôi biết là (N * (N + 1))/2)"
từ cơ sở 10 đến cơ sở 2.
Bạn có thể cho tôi một gợi ý về cách tôi có thể giải quyết nó mà không thay đổi cơ sở?Với mảng n-1 * n, tìm số bị thiếu

+0

Các số được sắp xếp ở vị trí đầu tiên? Nếu không, tôi đoán là sẽ tạo ra các số từ 1..N trong một mã bit và kiểm tra xem chúng có nằm trong mảng hay không. Tôi tìm thấy một cái gì đó thú vị, khi bạn chia cho 2 một số nhị phân thậm chí (chẳng hạn như 12 (10): 1100 (2), bạn chỉ cần di chuyển các chữ số của một bên phải (12 (10)/2: 0110 (2)) – Fabinout

+0

@Fabinout: Không có chúng không được sắp xếp – Aravind

+1

Ý tưởng của bạn thực sự khá tuyệt vời Bạn có thể dễ dàng nhân hai số nhị phân, sau đó trượt các chữ số sang phải để lấy tổng các số trong mảng. Các số từ mảng để có được số nhị phân cuối cùng bị thiếu – Fabinout

Trả lời

8

Bạn có thể XOR cùng nhau tất cả các số từ 0 .. N phạm vi, sau đó XOR các số từ mảng. Kết quả sẽ là số bị thiếu.

Giải thích:XOR nhập số bằng chính nó luôn dẫn đến 0. Thuật toán trên XOR s mỗi số chính xác hai lần, ngoại trừ số bị thiếu. Số bị thiếu sẽ là XOR -ed với số không chính xác một lần, do đó kết quả sẽ bằng số bị thiếu.

Lưu ý: người phỏng vấn là sai trên cần phải chuyển đổi các căn cứ để làm bổ sung: thêm số nhị phân rất dễ dàng và vui vẻ - trong thực tế, máy tính làm điều đó tất cả các thời gian :-)

+0

Cảm ơn có, điều đó cần thực hiện thủ thuật – Aravind

+0

: Người phỏng vấn có nghĩa là bước mà tôi nhận được tổng số N đầu tiên, tôi sẽ nhận được (N * (N + 1))/2, mà sẽ được trong cơ sở 10, và tôi sẽ phải chuyển đổi nó thành cơ sở 2. – Aravind

+0

@Aravind phép nhân nhị phân là khá dễ dàng .. – Fabinout

1

Bạn chỉ có thể XOR những các số cùng nhau và XOR với 1..n. Thực tế là các số được lưu trữ trong nhị phân là một gợi ý tốt, BTW. Trên thực tế, bất kỳ toán tử giao hoán nào có nghịch đảo đều hoạt động, vì nếu toán tử giao hoán, thứ tự không quan trọng, vì vậy nó có thể được áp dụng cho các số bạn có và 1..n, với sự khác biệt là đầu tiên không hoạt động trên số không nằm trong mảng. Sau đó, bạn có thể sử dụng nghịch đảo của nó để tìm số đó, với hai kết quả bạn có. SO +-, */, XORXOR và bất kỳ nhà khai thác nào khác đáp ứng yêu cầu đều phải hoạt động tại đây.

+0

Cảm ơn, vâng điều đó sẽ hoạt động. – Aravind

+0

Cả hai câu trả lời đều tuyệt vời, nhưng tôi chỉ có thể chấp nhận một câu trả lời. Tôi có + 1-ed của bạn. Xin lỗi vì tôi không thể chấp nhận của bạn.Thanks! :) – Aravind

+0

@Aravind Không có vấn đề gì, dasblinkenlight nhanh hơn tôi - thực ra, bài viết đầu tiên của anh ấy là của tôi, nhưng tôi tin rằng tôi đã chỉnh sửa bài viết này đủ khác để tôi không xóa bài đăng của mình. Bạn nói đúng rằng bạn nên chấp nhận câu trả lời của mình :) –

Các vấn đề liên quan