Как удалить повторяющиеся отсортированные массивы в Javascript? Я попытался создать новый массив, используя синтаксис распространения в новом наборе, но это выглядит чрезвычайно сложно и заставило мой результирующий набор выглядеть так:
[ [ '-', '1', ',', '0', ',', '1' ],
[ '-', '1', ',', '-', '1', ',', '2' ] ]
[ [ '-', '1', ',', '0', ',', '1' ],
[ '-', '1', ',', '-', '1', ',', '2' ] ]
[ [ '0', ',', '0', ',', '0' ] ]
[ [ '0', ',', '0', ',', '0' ] ]
[ [ '-', '4', ',', '-', '2', ',', '6' ],
[ '-', '4', ',', '0', ',', '4' ],
[ '-', '4', ',', '1', ',', '3' ],
[ '-', '4', ',', '2', ',', '2' ],
[ '-', '2', ',', '-', '2', ',', '4' ],
[ '-', '2', ',', '0', ',', '2' ] ]
[ [ '-', '4', ',', '-', '2', ',', '6' ],
[ '-', '4', ',', '0', ',', '4' ],
[ '-', '4', ',', '1', ',', '3' ],
[ '-', '4', ',', '2', ',', '2' ],
[ '-', '2', ',', '-', '2', ',', '4' ],
[ '-', '2', ',', '0', ',', '2' ] ]
или
[ [ '-1,0,1' ], [ '-1,-1,2' ] ]
[ [ '-1,0,1' ], [ '-1,-1,2' ] ]
[ [ '0,0,0' ] ]
[ [ '0,0,0' ] ]
[ [ '-4,-2,6' ],
[ '-4,0,4' ],
[ '-4,1,3' ],
[ '-4,2,2' ],
[ '-2,-2,4' ],
[ '-2,0,2' ] ]
[ [ '-4,-2,6' ],
[ '-4,0,4' ],
[ '-4,1,3' ],
[ '-4,2,2' ],
[ '-2,-2,4' ],
[ '-2,0,2' ] ]
заметьте, это после того, как я установил их в строки. Набор не удалит повторяющиеся отсортированные массивы, поскольку они являются разными объектами.
Вот код.
var threeSum = function (arr) {
let map = new Map();
for (let i = 0; i < arr.length; i++) {
let num = arr[i];
if (map.has(num)) {
map.get(num).push(i);
}
else {
map.set(num, [i]);
}
}
const results = [];
for (let i = 0; i < arr.length; i++) {
for (let j = i + 1; j < arr.length; j++) {
let diff = (arr[i] + arr[j]);
diff = (diff == 0) ? diff: diff * -1;
if (map.has(diff)) {
let mArr = map.get(diff);
for (let k = 0; k < mArr.length; k++) {
if (mArr[k] != i && mArr[k] != j ) {
results.push([arr[i], arr[j], diff]);
}
}
}
}
}
results.forEach((value) => {
value.sort((a, b) => { return a - b });
});
let newResults = results.filter((val, idx, arr) => {
/// how do i do this
})
console.info(newResults);
return newResults;
}
console.info(threeSum([-1, 0, 1, 2, -1, -4]));
console.info(threeSum([0,0,0,0]));
console.info(threeSum([-4,-2,-2,-2,0,1,2,2,2,3,3,4,4,6,6]));
Каков формат ожидаемого вывода?
Ожидается: [[-4,-2,6],[-4,0,4],[-4,1,3],[-4,2,2],[-2,-2,4], [-2,0,2]]
И какой вход для этого?
Ввод: [-4,-2,-2,-2,0,1,2,2,2,3,3,4,4,6,6]
хорошо ... не ясно, какие правила разбиения на фрагменты должны получить ожидаемые результаты от этого ввода
LMAO Имея массив nums из n целых чисел, существуют ли элементы a, b, c в nums такие, что a + b + c = 0? Найдите все уникальные триплеты в массиве, сумма которых равна нулю. Примечание. В наборе решений не должно быть повторяющихся троек.
задавать идеально подходит для этой задачи. Наборы поддерживают условие уникальности всех своих элементов. Вот как вы можете выполнить свою задачу:
let set = new Set(results.map(result => JSON.stringify(result))
Array.from(set).map(elem => JSON.parse(elem))
Необходимо преобразовать массивы в строки, чтобы они были уникальными в наборе. [1,2] != [1,2]
... попробуй console.info(new Set([[1,2], [1,2]])) // size=2
Да, это дало мне точно такой же массив
Извините, я совсем забыл об этом. Как вы можете исправить мою ошибку, .map
преобразуя результаты в строки перед их вставкой в набор, а затем .map
возвращая их обратно в массивы, когда вы извлекаете их из набора. Я отредактировал свой ответ, чтобы отразить это.
И также должны быть отсортированы перед их строкой
.sort
можно вызывать после преобразования набора в ошибку и перед отображением строки обратно в массив.
Ааа, но если бы результаты были [[1,2],[2,1]]
, а OP нужны уникальные отсортированные массивы ... они будут преобразованы в 2 заданных значения без сортировки
Черт возьми, я знал, что что-то упускаю. При сопоставлении вывода вы можете отсортировать перед строкой JSON.stringify(result.sort())
, а затем также отсортировать сопоставленный вывод.
Могут быть и другие проблемы при формировании results
, но просто получить уникальные элементы из отсортированного массива:
Определите функцию для проверки равенства массивов a
и b
для первых L
индексов (поскольку a == b
сам по себе не работает):
let equal = function(a, b, L){
for (let i=0; i<L; ++i) {
if (a[i] != b[i]) return false;
}
return true;
}
Нажмите на newResults
при обнаружении нового элемента.
var threeSum(...
...
if (results.length == 0){
return [];
}
newResults = [results[0]];
for (let i = 1; i < results.length; ++i){
if (!equal(results[i], newResults[newResults.length - 1], 3)){
newResults.push(results[i]);
}
}
return newResults;
}
Но могут быть некоторые другие проблемы, такие как перебор всех элементов map.get(diff)
, хотя первый элемент mArr[0]
является ключом (а остальные значения)
Пока они отсортированы, вы можете преобразовать массив в строку с помощью JSON.stringify или join() и перейти к Set или Map в качестве строковых ключей.