Наивное решение - проверять каждый элемент на каждый другой элемент. Это расточительно и дает решение O (n2), даже если вы только переходите вперед.
Лучшее решение сортирует массив, а затем проверяет каждый элемент рядом с ним, чтобы найти дубликаты. Выберите эффективную сортировку, и это O (n log n).
Недостаток решения на основе сортировки не поддерживается. Однако дополнительный шаг может позаботиться об этом. Поместите все записи (в уникальном отсортированном массиве) в хеш-таблицу, которая имеет доступ O (1). Затем перебираем исходный массив. Для каждого элемента проверьте, находится ли он в хеш-таблице. Если это так, добавьте его в результат и удалите из хеш-таблицы. Вы получите результирующий массив, который имеет порядок оригинала, причем каждый элемент находится в том же положении, что и его первое вхождение.
Если вы имея дело с целыми числами некоторого фиксированного диапазона, вы можете сделать еще лучше, используя сортировку radix. Если вы предполагаете, что все номера находятся в диапазоне от 0 до 1 000 000, например, вы можете выделить бит-вектор около 1000,001. Для каждого элемента в исходном массиве вы устанавливаете соответствующий бит на основе его значения (например, значение 13 приводит к установке 14-го бита). Затем перейдите к исходному массиву, проверьте, находится ли он в битовом векторе. Если это так, добавьте его в массив результатов и очистите этот бит от битового вектора. Это O (n) и пространство трейдинга для времени.
Это приводит нас к лучшему решению всего: сортировка на самом деле является отвлечением, хотя и полезным. Создайте хэш-таблицу с доступом O (1). Перейдите к исходному списку. Если он уже не в хэш-таблице, добавьте его в массив результатов и добавьте его в хеш-таблицу. Если он находится в хеш-таблице, игнорируйте его.
Это, безусловно, лучшее решение. Так почему же остальные? Потому что такие проблемы связаны с адаптацией знаний, которые у вас есть (или должны иметь) к проблемам, и их уточнения на основе предположений, которые вы принимаете в решении. Разработка решения и понимание мышления, стоящего за ним, гораздо полезнее, чем срывание решения.
Кроме того, хеш-таблицы не всегда доступны. Возьмите встроенную систему или что-то там, где пространство ОЧЕНЬ ограничено. Вы можете реализовать быструю сортировку в нескольких кодах операций, гораздо меньше, чем любая хеш-таблица.
Примечание. keyCode
- становится устаревшим , используйте вместо него ключ
.
function keyPress (e) {
if(e.key === "Escape") {
// write your logic here.
}
}
Вот jsfiddle
keyCode
устарел
Кажется,
keydown
иkeyup
работают, хотяkeypress
не может
$(document).keyup(function(e) {
if (e.key === "Escape") { // escape key maps to keycode `27`
// <DO YOUR WORK HERE>
}
});
проверьте keyCode
&& , который
& keyup
|| keydown
$(document).keydown(function(e){
var code = e.keyCode || e.which;
alert(code);
});
Событие keydown
отлично подойдет для Escape и имеет то преимущество, что позволяет использовать keyCode
во всех браузерах. Также необходимо прикрепить слушателя к document
, а не к body.
Обновление май 2016 года
keyCode
сейчас находится в процессе устаревания, и большинство современных браузеров теперь предлагают свойство key
хотя вам все еще понадобится fallback для поддержки приличного браузера (на момент написания статьи текущие выпуски Chrome и Safari не поддерживают его).
Обновление сентября 2018 года
evt.key
теперь поддерживается всеми современными браузерами.
document.onkeydown = function(evt) { evt = evt || window.event; var isEscape = false; if ("key" in evt) { isEscape = (evt.key === "Escape" || evt.key === "Esc"); } else { isEscape = (evt.keyCode === 27); } if (isEscape) { alert("Escape"); } } };
Нажмите на меня, затем нажмите клавишу Escape