j0hnik,
:thanks: |
Цитата:
[2,5,9,9,2,2].reduce((a, b) => a ^ b) //7 ?? :-? |
Белый шум,
наверно в задании только пары чисел и одно одиночное число |
как уже говорил, с двумя уникальными числами (надо найти оба) тоже есть решение, и там чуть интереснее
|
Цитата:
Alexandroppolus, ссылку |
Цитата:
|
Alexandroppolus,
var arr = [1,1,2,5,9,9,7,7];
function unq(arr){
var newArr = [];
for(var i = 0; i<arr.length; i++){
var x = arr[i];
arr[i] = null;
if(!arr.includes(x)) {
newArr.push(x);
if(newArr.length == 2) return newArr;
continue;
}
arr[i] = x;
}
}
console.log(unq(arr));
|
j0hnik,
не то :) решается аналогично предыдущей, с теми же ограничениями - O(n) по времени выполнения, O(1) по вспомогательной памяти |
Alexandroppolus,
в массиве пары могут быть любыми? могут быть пропуски? например с пару сотен пропущенных. два уникальных остальные пары? |
Цитата:
да, некоторых чисел может не быть. |
Alexandroppolus,
var arr = [1,1,2,5,9,9,7,7];
function unq(arr) {
var obj = {};
for(var i = 0; i < arr.length; i++){
var num = arr[i];
obj[num] ? delete obj[num] : obj[num] = 1;
}
return Object.keys(obj).map(n=>+n);
}
console.log(unq(arr));
|
опять не то. В таком решении вспомогательной памяти дохрена используется. А нужно O(1), т.е. несколько байт, независимо от длины массива. Как в решении для одного уникального
|
Alexandroppolus,
это решение проходит на кодварс, по заданию где один уникальный, надо лишь заменить return +Object.keys(obj)[0] |
Alexandroppolus,
как еще быстрей я хз, я сдаюсь, пишите |
Цитата:
---- ответ писать пока не буду, вдруг ещё кто заинтересуется |
Alexandroppolus,
в личку |
если задача найти уникальные для массива целых чисел, то это можно сделать так:
const arr = [1,1,2,5,9,9,7,7]
function uniq (x) {
return Array.from(new Set(x))
}
alert(uniq(arr))
:) |
Кто знает существует ли более быстрый способ оставить уникальные элементы?
массив +- как в примере.
var rnd =()=> Math.floor(Math.random() * 500);
var arr = [], i = 1000;
while(i--) arr.push(rnd());
var uniq =arr=>{
var newArr = [];
for (var i = 0; i<arr.length; i++){
var flag = true;
for (var j = 0; j<newArr.length; j++){
if(arr[i]===newArr[j]) {
flag = false;
break;
}
}
if(flag) newArr.push(arr[i]);
}
return newArr;
};
console.log(uniq(arr))
|
вариант из предыдущего поста должен быть в разы быстрее.
у тебя же квадратичная сложность, это весьма неоптимальный способ ) |
Цитата:
https://jsperf.com/4543543543 |
Цитата:
в итоге в массив напушилось одно и то же значение, и никакого вложенного цикла по факту и не было https://jsperf.com/uniqs5436436/ - исправленное и дополненное вариант 3 - тоже с Set, только заполняется по ходу пьесы, в Хроме он оказался быстрее первого варианта, в ФФ медленнее (но оба они существенно быстрее второго, который рулит, только если разных значений совсем мало). вариант 4 "читерский", заточен под конкретные данные, вместо Set используется настоящий массив, и он ожидаемо уделывает всех без шансов |
Alexandroppolus,
Цитата:
спасибо за способы, и почему я сразу до такого 'кеша' не додумался.
if (s[v] === 0) {
newArr.push(v);
s[v] = 1;
}
|
Продолжаем тему reverse, с которой стартовал топик :)
https://www.codewars.com/kata/block-exchanging-reverse/ Требуется развернуть массив из 99 элементов, единственное допустимое действие - обменять местами любые два соседних слайса, и надо уложиться в 50 обменов. Пример действия: было [0, 1, 2, 3, 4, 5, 6], стало [0, 3, 4, 5, 1, 2, 6] - обменяли местами куски [1, 2] и [3, 4, 5] |
вариант reverse
function doReverse(a) {
var c = a.length,
d = Math.floor(c / 2),
b = a.slice(d);
a.length = d;
2 < c && (b = doReverse(b), a = doReverse(a));
return b.concat(a)
};
var i = doReverse([0, 1, 2, 3, 4, 5, 6])
alert(i);
var a = Array.from({length : 100}, (a,b)=>b)
alert(a);
a = doReverse(a);
alert(a);
|
рони,
нет, сами куски во время обмена нельзя разворачивать. См. пример. |
Извиняюсь что врываюсь в тему, а не подскажите к какой математической теории (решению, алгоритму) мне обратится с такой задачей:
Есть лист бумаги размером 1250 х 2000 мм Нужно его раскроить по размеру 1250 на заготовки размерами 180, 230, 95 мм чтобы получился минимальный отход. Размер 2000 не трогаем он остаётся для заготовок. Кол-во заготовок задаётся динамически (под заказ). В реальности и размеры 180, 230, 95 тоже под заказ, я их как пример указал. Нужно найти оптимальную схему раскроя. Вы тут люди с большим опытом и наверняка решали подобные задачи. Я нашёл задачу Канторовича, разбираю её и вроде как понимаю смысл, но решить и написать код пока не пробовал - по моему у него для решения более сложных задач, чем то что мне нужно. Подскажите пожалуйста, куда мне копать? |
MC-XOBAHCK,
95,95,95,95,180,230,230,230 |
Цитата:
Я наверно как обычно непонятно описал задачу, имеется ввиду оптимально раскроить какое то кол-во листов, чтобы получить например: 230 - 40 штук 180 - 45 штук 95 - 16 штук. |
Цитата:
|
Цитата:
|
| Часовой пояс GMT +3, время: 01:27. |