Вы просто меняете 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}"
);
}
Самое быстрое (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", который является единственным, который происходит однажды.
Это работает, потому что в первый раз Вы поражаете число, оно отмечает цифровую переменную с собой и во второй раз, когда оно снимает выделение с цифры с собой (более или менее). Единственный, который остается неотмеченным, является Вашим недубликатом.
Решение Kyle, очевидно, не поймало бы ситуации, был набор данных, не следует правилам. Если бы все числа были в парах, то алгоритм дал бы результат нуля, то же самое значение, как будто нуль был бы единственным значением с единственным происшествием.
, Если бы было несколько единственных значений происшествия или утраиваются, результатом был бы errouness также.
Тестирование набора данных могло бы хорошо закончиться с более дорогостоящим алгоритмом, или в памяти или время.
решение Csmba действительно показывает некоторые errouness данные (не или более тогда одно единственное значение происшествия), но не другой (quadrouples). Относительно его решения, в зависимости от реализации HT, любой памяти и/или время больше тогда O (n).
, Если мы не можем быть уверены в правильности входного набора, сортируя и рассчитывая или с помощью хеш-таблицы, считая происшествия с самим целым числом, являющимся ключом хеша, оба было бы выполнимо.
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 был бы (до сих пор) лучшим решением.
Я сказал бы, что использование алгоритма сортировки и затем прохождение через отсортированного списка для нахождения числа являются хорошим способом сделать это.
И теперь проблема находит "лучший" алгоритм сортировки. Существует большая сортировка алгоритмов, каждого из них с его сильными сторонами и слабыми местами, таким образом, это - вполне сложный вопрос. статья в Википедии походит на хороший источник информации об этом.
Походит на лучшее, которое Вы могли сделать, должен выполнить итерации через список, поскольку каждый объект добавляет его к списку "замеченных" объектов или иначе удаляет его из "замеченного", если это уже там, и в конце Ваш список "замеченных" объектов будет включать исключительный элемент. Это - O (n) в отношении времени и n в отношении пространства (в худшем случае, будет намного лучше, если список будет отсортирован).
то, что они - целые числа, действительно не включает в, так как там действительно ли ничто не является особенным, можно ли сделать со складыванием их... там?
Вопрос
я не понимаю, почему выбранный ответ является "лучшим" по любому стандарту. O (N*lgN)> O (N), и это изменяет список (или иначе создает копию его, которая является еще более дорогой в пространстве и времени). Я пропускаю что-то?
Зависит от того, насколько большой/маленький/разнообразный числа все же. Вид основания мог бы быть применимым, который уменьшит время сортировки O (N, регистрируют N), решение значительной степенью.
Необходимо определить то, под чем Вы подразумеваете "лучше всего" - некоторым, скорость - все, что имеет значение и квалифицировало бы ответ как "лучше всего" - для других, они могли бы простить несколько сотен миллисекунд, если бы решение было более читаемым.
"Лучший" субъективно, если Вы не более конкретны.
<час>, Который сказал:
Выполняют итерации через числа, поскольку каждое число ищет список то число и когда Вы достигаете числа, которое возвращает только 1 для количества результатов поиска, Вы сделаны.
Метод сортировки и метод XOR имеют ту же временную сложность. Метод XOR только O (n), если Вы предполагаете, что поразрядный XOR двух строк является постоянной операцией времени. Это эквивалентно высказыванию, что размер целых чисел в массиве ограничен константой. В этом случае можно использовать вид Основания для сортировки массива в O (n).
, Если числа не ограничены, то поразрядный XOR занимает время O (k), где k является длиной строки битов, и метод XOR берет O (nk). Теперь снова вид Основания отсортирует массив вовремя O (nk).
Вы могли просто поместить элементы в набор в хеш, пока Вы не находите коллизию. В рубине это - острота.
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
Между прочим, можно подробно остановиться на этой идее очень, быстро находят два уникальные числа среди списка дубликатов.
Позволяют нам назвать уникальные числа 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 полностью.
Обман.