2009-12-24 4 views
3

Я столкнулся с thos quesiton в поиске Google ... они выглядят довольно часто, но я не мог найти достойного ответа. любые советы/ссылки?вопросы интервью - небольшая помощь

1.Remove дубликатов в массиве в O (N) без дополнительного массива

2.Write программу, в которой печатная продукция является точной копией источника. Излишне говорить, что просто повторение фактического исходного файла недопустимо.

+0

Как .exe файл можно распечатать на C++ исходный файл без вторя исходный файл? – YOU

+5

Ненавижу вопросы, такие как номер один.На самом деле бессмысленно задавать такие вопросы и заставлять людей чувствовать себя глупыми. В моей практике они будут задавать такие алгоритмические вопросы только для того, чтобы нанять вас для написания графического интерфейса. –

+5

То, что я ненавижу по этим вопросам, заключается в том, что они не имеют практической цели и ничего не показывают о кандидате, за исключением того, «накануне. Они - ленивые вещи, чтобы спросить, и я был бы осторожен в найме человека, который читал бы что-нибудь в них о моих истинных способностях программиста. Эти вопросы, особенно второй, - это просто BS. Если вы столкнетесь с этим в своем интервью, попросите их о практическом сценарии в той роли, к которой вы обращались, в которой эта проблема возникает. Это как просить каменщиков, если они могут манипулировать кирпичами. – Simon

ответ

10

(1) невозможно, если массив не настроен. Основной ответ состоит в том, чтобы держать два указателя в массиве, один идти вперед, ища неравные элементы, и один трейлинг-указатель. Когда прямой указатель встречает неравный элемент, он копирует его в трейлинг-указатель и увеличивает трейлинг-указатель.

(2) У меня нет под рукой. Это звучит как довольно ужасный вопрос интервью. В большинстве интерпретируемых языков 0-байтовый (пустой) исходный файл является допустимым входом и не выводит ничего, что должно подсчитываться.

+2

Хех, +1 за ваш ответ на # 2. Лучший способ ответить на такой бессмысленный вопрос: p – jalf

+0

, если массив не предварительно отсортирован, его можно легко отсортировать с помощью сортировки кучи. – Anna

+0

@ Анна вопрос сказал «в O (n) раз». Сортировка массива не может быть выполнена быстрее, чем O (nlogn); поэтому мой комментарий о том, что массив должен быть предварительно отредактирован –

5

Для (1) вам, вероятно, потребуется больше ограничений, чем вы указали. Однако посмотрите radix sort.

Для (2), посмотреть quine.

+1

Radix sort не будет работать, потому что вам не разрешен внешний массив. – Blindy

+0

Я уверен, что возможно реализовать радиусную сортировку на месте. Я мог ошибаться, но сейчас я думаю об этом, и не могу понять, где я столкнулся с проблемой. – Gravity

3

Для вашего второго вопроса google for quine вы найдете много ответов!

0

. Ближайший, к которому вы можете добраться, - это использование хеш-таблицы для хранения замеченных элементов и присвоение каждому не дублируемому значению соответствующего значения в начале массива (в конце это оставило бы несколько нерелевантных) - это было бы возьмите O (n) время, но это не та вещь, которую вы хотите написать во время собеседования. В качестве альтернативы, пока список отсортирован, просто проверьте, равен ли каждый элемент предыдущему.

Для 2 будет разрешена только ручная печать содержимого файла? (если так, то вопрос более чем немного бессмыслен).

Edit:

Вот быстрая версия Perl моего решения к первой - в C++ вы должны создать хэш вручную:

# Return an unsorted version of an array without duplicates 
sub unsortedDedup { 
    my %seen, my @return; 

    map { 
     $seen{$_} = 1 
     && push @return, $_ 
     unless (defined $seen{$_}) 
    } @_; 

    @return; 
} 
0

STL часто не вариант в таких вопросы интервью, но вот один из способов сделать # 1 с использованием STL, хотя он понесет дополнительный вид (как объяснено Terry's answer):

#include <iostream> 
#include <algorithm> 
#include <iterator> 

int main() 
{ 
    int a[] = { 2, 2, 3, 2, 1, 4, 1, 3, 4, 1 }; 
    int * end = a + sizeof(a)/sizeof(a[0]); 

    std::sort(a, end);   // O(n log n) 
    end = std::unique(a, end); // O(n) 

    std::copy(a, end, std::ostream_iterator<int>(std::cout, " ")); 
    std::cout << std::endl; 
} 

Вот результат :

$ ./a.out 
1 2 3 4 

std::unique() обычно реализуется с использованием той же методики, описанной Терри в своем ответе (см bits/stl_algo.h в г ++ реализация STL 's для примера того, как его реализовать).

Смежные вопросы