Нахождение единственного числа в списке [дубликат]

Вы просто меняете App_Start/WebApiConfig.cs следующим образом:

public static void Register(HttpConfiguration config)
    {
        // Web API configuration and services

        // Web API routes
        config.MapHttpAttributeRoutes();
        //Below formatter is used for returning the Json result.
        var appXmlType = config.Formatters.XmlFormatter.SupportedMediaTypes.FirstOrDefault(t => t.MediaType == "application/xml");
        config.Formatters.XmlFormatter.SupportedMediaTypes.Remove(appXmlType);
        //Default route
        config.Routes.MapHttpRoute(
           name: "ApiControllerOnly",
           routeTemplate: "api/{controller}"
       );
    }
39
задан Motti 26 September 2008 в 01:38
поделиться

10 ответов

Самое быстрое (O (n)) и большая часть эффективной памяти (O (1)) путь с операцией "исключающее ИЛИ".

В C:

int arr[] = {3, 2, 5, 2, 1, 5, 3};

int num = 0, i;

for (i=0; i < 7; i++)
    num ^= arr[i];

printf("%i\n", num);

Это печатает "1", который является единственным, который происходит однажды.

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

136
ответ дан Kyle Cronin 23 September 2019 в 17:07
поделиться

Решение Kyle, очевидно, не поймало бы ситуации, был набор данных, не следует правилам. Если бы все числа были в парах, то алгоритм дал бы результат нуля, то же самое значение, как будто нуль был бы единственным значением с единственным происшествием.

, Если бы было несколько единственных значений происшествия или утраиваются, результатом был бы errouness также.

Тестирование набора данных могло бы хорошо закончиться с более дорогостоящим алгоритмом, или в памяти или время.

решение Csmba действительно показывает некоторые errouness данные (не или более тогда одно единственное значение происшествия), но не другой (quadrouples). Относительно его решения, в зависимости от реализации HT, любой памяти и/или время больше тогда O (n).

, Если мы не можем быть уверены в правильности входного набора, сортируя и рассчитывая или с помощью хеш-таблицы, считая происшествия с самим целым числом, являющимся ключом хеша, оба было бы выполнимо.

4
ответ дан Ralph M. Rickenbach 23 September 2019 в 17:07
поделиться

O (N) время, O (N) память

HT = Хэш-таблица

HT.clear () пробегаются через список для каждого объекта, который Вы видите

if(HT.Contains(item)) -> HT.Remove(item)
else
ht.add(item)

в конце, объект в HT является объектом, который Вы ищете.

Примечание (кредит @Jared Updike): Эта система найдет все Нечетные экземпляры объектов.

<час>

комментарий : Я не вижу, как люди могут проголосовать за решения, которые дают Вам работу NLogN. в котором вселенная - это "лучше"? Я еще более потрясен, Вы отметили принятый ответ s решение NLogN...

я действительно соглашаюсь однако что, если бы память требуется, чтобы быть постоянной, то NLogN был бы (до сих пор) лучшим решением.

10
ответ дан csmba 23 September 2019 в 17:07
поделиться

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

И теперь проблема находит "лучший" алгоритм сортировки. Существует большая сортировка алгоритмов, каждого из них с его сильными сторонами и слабыми местами, таким образом, это - вполне сложный вопрос. статья в Википедии походит на хороший источник информации об этом.

1
ответ дан Farinha 23 September 2019 в 17:07
поделиться

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

то, что они - целые числа, действительно не включает в, так как там действительно ли ничто не является особенным, можно ли сделать со складыванием их... там?

Вопрос

я не понимаю, почему выбранный ответ является "лучшим" по любому стандарту. O (N*lgN)> O (N), и это изменяет список (или иначе создает копию его, которая является еще более дорогой в пространстве и времени). Я пропускаю что-то?

0
ответ дан levand 23 September 2019 в 17:07
поделиться

Зависит от того, насколько большой/маленький/разнообразный числа все же. Вид основания мог бы быть применимым, который уменьшит время сортировки O (N, регистрируют N), решение значительной степенью.

0
ответ дан chakrit 23 September 2019 в 17:07
поделиться

Необходимо определить то, под чем Вы подразумеваете "лучше всего" - некоторым, скорость - все, что имеет значение и квалифицировало бы ответ как "лучше всего" - для других, они могли бы простить несколько сотен миллисекунд, если бы решение было более читаемым.

"Лучший" субъективно, если Вы не более конкретны.

<час>

, Который сказал:

Выполняют итерации через числа, поскольку каждое число ищет список то число и когда Вы достигаете числа, которое возвращает только 1 для количества результатов поиска, Вы сделаны.

0
ответ дан Jason Bunting 23 September 2019 в 17:07
поделиться

Метод сортировки и метод XOR имеют ту же временную сложность. Метод XOR только O (n), если Вы предполагаете, что поразрядный XOR двух строк является постоянной операцией времени. Это эквивалентно высказыванию, что размер целых чисел в массиве ограничен константой. В этом случае можно использовать вид Основания для сортировки массива в O (n).

, Если числа не ограничены, то поразрядный XOR занимает время O (k), где k является длиной строки битов, и метод XOR берет O (nk). Теперь снова вид Основания отсортирует массив вовремя O (nk).

0
ответ дан 23 September 2019 в 17:07
поделиться

Вы могли просто поместить элементы в набор в хеш, пока Вы не находите коллизию. В рубине это - острота.

def find_dupe(array)
  h={}
  array.detect { |e| h[e]||(h[e]=true; false) }
end

Так, find_dupe([1,2,3,4,5,1]) возвратился бы 1.

Это - на самом деле общий вопрос об интервью "приема" все же. Это обычно о списке последовательных целых чисел с одним дубликатом. В этом случае интервьюер часто ищет Вас для использования Гауссовой суммы n - целочисленный прием, например, n*(n+1)/2 вычтенный из фактической суммы. Ответ учебника - что-то вроде этого.

def find_dupe_for_consecutive_integers(array)
  n=array.size-1   # subtract one from array.size because of the dupe
  array.sum - n*(n+1)/2
end
-1
ответ дан hoyhoy 23 September 2019 в 17:07
поделиться

Между прочим, можно подробно остановиться на этой идее очень, быстро находят два уникальные числа среди списка дубликатов.

Позволяют нам назвать уникальные числа a и b. Сначала возьмите XOR всего как предложенный Kyle. То, что мы получаем, является a^b. Мы знаем a^b! = 0, с тех пор a! = b. Выберите любой 1 бит a^b и использование что как маска - более подробно: выберите x в качестве питания 2 так, чтобы x & (a^b) является ненулевым.

Теперь разделяет список на два подсписка - один подсписок содержит все числа y с y& x == 0, и остальные входят в другой подсписок. По тому, как мы выбрали x, мы знаем, что a и b находятся в различных блоках. Мы также знаем, что каждая пара дубликатов находится все еще в том же блоке. Таким образом, мы можем теперь применить Вас olde "XOR-em-all" прием к каждому блоку независимо и обнаружить то, что a и b полностью.

Обман.

18
ответ дан Tyler 23 September 2019 в 17:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: