Долго пытался решить эту задачу. Думал, что найду решение “поэлегантнее”. Ну, имею то, что имею. Т.к. на форуме нету темы на эту задачу, тогда я сам ее и создам. Код и скрин:
var numbers = [1, 4, 5, 9, 2, 5, 1];
var uniqueNumbers = [];
var secondNumbers = [];
for (var i = 0; i < numbers.length; i++) {
for (var j = i + 1; j < numbers.length; j++) {
if (numbers[i] === numbers[j]) {
secondNumbers.push(numbers[i]);
}
}
}
for (var i = 0; i < numbers.length; i++) {
for (var j = 0; j < secondNumbers.length; j++) {
if (numbers[i] === secondNumbers[j]) {
numbers.splice(i, 1);
i–;
}
}
}
for (var i = 0; i < numbers.length; i++) {
uniqueNumbers.push(numbers[i]);
}
var numbers = [1, 4, 5, 9, 2, 5, 1];
var uniqueNumbers = [];
for (var i = 0; i < numbers.length; i++) {
var number = numbers[i];
var k = 0;
for (var j = 0; j < numbers.length; j++) {
if (number === numbers[j]) {
k ++;
}
}
if (k === 1) {
uniqueNumbers.push(number)
}
}
при написание кода цель не писать коротко, а писать код понятный и выразительный для людей, легко читаемый и легко тестируемый. По этой причине continue лучше не использовать
var numbers = [1, 4, 5, 9, 2, 5, 1];
var uniqueNumbers = [];
//Создаем массив для неуникальных ключей
var noUniqueNumbers = [];
for (var i = 0; i < numbers.length; i++) {
//Первая проверка есть ли в нашем массиве дубли , вторая проверка есть ли в массиве noUniqueNumbers проверяемый ключ, если проверяемый ключ проверки проходит то добавляем его в uniqueNumbers , иначе если данного ключа нету в noUniqueNumbers добавляем ключ в noUniqueNumbers( для красоты массива noUniqueNumbers , исключил повторения в нём ключей)
if (numbers.indexOf(numbers[i],i + 1) < 0 && noUniqueNumbers.indexOf(numbers[i]) < 0 ) {
uniqueNumbers.push(numbers[i]);
} else if (noUniqueNumbers.indexOf(numbers[i]) < 0) {
noUniqueNumbers.push(numbers[i]);
}
}
console.log(uniqueNumbers);
console.log(noUniqueNumbers);
var numbers = [12,12,15,7,1,15];
var uniqueNumbers = [];
for (var i=0; i<numbers.length; i++) //прогон всех элементов массива
{var ifUnique = true; //факт уникальности элемента с номером i
for (var j=0; j<numbers.length; j++) //прогон остальных элментов массива
{if (numbers[i]===numbers[j] && i!==j) //если неуникален & не он же
{ifUnique = false;
}
}
if (ifUnique) {uniqueNumbers.push(numbers[i]);} //если ifUnique все еще тру - вписываем i
}
var numbers = [4,1,2,3,4,0,7,5,6,7,0,0,1,8,2,9,0];
var repeatNumbers = [];
var uniqueNumbers = [];
var pass;
var repeat;
for (var i=0;i<numbers.length;i++){ // прогоняем элементы, на очереди i-тый, текущий
repeat = false; // флаг на найденное повторяющееся число
pass = false; // флаг на пропуск i-того повторяющегося элемента, который уже был
for (var j=0;j<repeatNumbers.length;j++){ // проверяем текущий элемент, нет ли его в массиве уже повторяющихся, встречавшихся ранее
if (numbers[i]==repeatNumbers[j]){
pass = true; // если он там есть хоть 1 раз то
break; // выходим из цикла и
}
}
if (!pass){ //пропускаем его сравнение, т.к. мы уже знаем что он неуникален, если же его там нет то
for (var j=i+1;j<numbers.length;j++){//прогоняем элементы от i+1
if (numbers[i]==numbers[j]){// если хотя бы 1 следующий элемент равен i-тому, то (он ведь повторился)
repeat=true; // присваеваем флагу repeat=true
break; // и выходим из цикла
}
}
if (!repeat){ // если текущий элемент не повторялся дальше по массиву(repeat=false)
uniqueNumbers.push(numbers[i]); // значит он уникален
}else{ // если же повторялся то
repeatNumbers.push(numbers[i]); // заносим его в массив повторяющихся
}
}
}
console.log(uniqueNumbers);
var numbers = [4,1,2,3,4,0,7,5,6,7,0,0,1,8,2,9,0];
var repeatNumbers = [];
var uniqueNumbers = [];
var pass;
var repeat;
for (var i=0;i<numbers.length;i++){ // прогоняем элементы, на очереди i-тый, текущий
repeat = false; // флаг на найденное повторяющееся число
pass = false; // флаг на пропуск i-того повторяющегося элемента, который уже был
for (var j=0;j<repeatNumbers.length;j++){ // проверяем текущий элемент, нет ли его в массиве уже повторяющихся, встречавшихся ранее
if (numbers[i]==repeatNumbers[j]){
pass = true; // если он там есть хоть 1 раз то
break; // выходим из цикла и
}
}
if (!pass){ //пропускаем его сравнение, т.к. мы уже знаем что он неуникален, если же его там нет то
for (var j=i+1;j<numbers.length;j++){//прогоняем элементы от i+1
if (numbers[i]==numbers[j]){// если хотя бы 1 следующий элемент равен i-тому, то (он ведь повторился)
repeat=true; // присваеваем флагу repeat=true
break; // и выходим из цикла
}
}
if (!repeat){ // если текущий элемент не повторялся дальше по массиву(repeat=false)
uniqueNumbers.push(numbers[i]); // значит он уникален
}else{ // если же повторялся то
repeatNumbers.push(numbers[i]); // заносим его в массив повторяющихся
}
}
}
console.log(uniqueNumbers);
Если отталкиваться только от той информации, которая доносилась в главе этого курса и практикума к нему, то мне кажется, что решение ниже будет наиболее оптимальным. Поправьте, если не прав.
var numbers = [1, 4, 5, 9, 2, 5, 1];
var uniqueNumbers = [];
for (var i = 0; i < numbers.length; i++) {
if (numbers.indexOf(numbers[i]) === numbers.lastIndexOf(numbers[i])) {
uniqueNumbers.push(numbers[i]);
}
}
var numbers = [1, 4, 5, 9, 2, 5, 1];
var uniqueNumbers = [];
for (var i = 0; i < numbers.length; i++) { // перебираем массив;
var temp = numbers[i]; // записываем текущий элемент в переменную;
var idx = numbers.indexOf(temp); // записываем индекс текущего элемента в переменную;
var tempArray = []; // создаем временный массив для хранения индексов;
while (idx != -1) { // перебираем массив до конца;
tempArray.push(idx); // записываем индекс во временный массив;
idx = numbers.indexOf(temp, idx + 1); // проверяем, дублируется ли элемент далее в массиве;
}
if (tempArray.length === 1) { // если во временный массив попал только один индекс,
uniqueNumbers.push(temp); // значит элемент по данному индексу уникален, записываем его;
}
}
пол дня сидел, разные решения искал, больше всего это понравилось, самое короткое:
var numbers = [1, 4, 5, 9, 2, 5, 1];
var uniqueNumbers = [];
for (var i = 0; i < numbers.length; i++) {
var check = true;
for (var c = 0; c < numbers.length; c++) {
if (numbers[i] == numbers[c] && i !== c) {
var check = false;
}
}
if (check) {
uniqueNumbers.push(numbers[i]);
}
}
var numbers = [101,15,116,20,116,15,2];
var uniqueNumbers = [];
for (var i = 0; i < numbers.length; i++) {
var index = numbers [i];
for (var j = 0; j < numbers.length; j++) {
if (numbers[j] === index && j != i) {
var repeat = numbers[j]
}
}
if (index !== repeat) {
uniqueNumbers.push(index);
}
}
Может кому нибудь пригодиться. искал более лаконичное решение, но пока что так
var numbers = [1, 4, 5, 9, 2, 5, 1];
var uniqueNumbers = [];
var freqCounter; //переменная частоты встречи какого либо числа
for (var i=0; i < numbers.length; i++){
freqCounter = 1;
for (var j=0; j < numbers.length; j++){
/*проверка является ли проверяемое число из массива им самим же, так как*/
/*внутренний цикл проходится по все элементов от начала до конца, ищя повторения*/
if (j === i){ continue; }
//если число натыкается на самого себе(с тем же индексом),
//то происходит пропуск итерации цикла
if (numbers[i] === numbers[j]){ freqCounter++; }
}
/* если число встретилось только раз, оно вводится в массив уникальных значений */
if (freqCounter === 1){uniqueNumbers.push(numbers[i]);}
}
ну ваше решение такое же как у предыдущих, только вместо булева флага вы “придумали” счетчик. и наплодили переменных.
а самое лаконичное все еще у Digna