Zadanie

0

Hej,

Mam do rozwiązania zadanie i nie mogę dojść do prawidłowego kodu..

Zadanie:
W pliku script.js stwórz tablicę z 10 dowolnymi liczbami (niech kilka będzie takich samych) oraz zmienną firstIndex. W pętli for sprawdź, która z liczb powatarza się jako pierwsza i przypisz jej indeks do zmiennej firstIndex. Następnie wypisz w konsoli tą zmienną, poza pętlą for.

Przykładowa tablica:

 var arrWithNumbers = [2,4,5,2,3,5,1,2,4];

W tej tablicy jako pierwsza powtarza się liczba 2, więc zmienna firstIndex powinna mieć wartość 0, ponieważ jest to pierwsza liczba w tablicy, która ma gdzieś swojego sobowtóra.
Przetestuj Twój skrypt z różnymi wartościami w tablicy.
Podpowiedź: pamiętaj o odpowiednim przerwaniu pętli.

Stworzyłem coś takiego, ale czuję że nawet nie jestem blisko..

var arrWithnumbers = [6, 4, 9, 2, 1, 5, 1, 2, 9, 7];
var firstIndex = 0;
for (var i=0; i < arrWithnumbers.length; i++) {
for (var j=0; j===arrWithnumbers; j++) {
firstIndex++;
break;
}
}
console.log(firstIndex);

1
var arrWithnumbers = [6, 4, 9, 2, 1, 5, 1, 2, 9, 7];
var firstIndex = -1;
for (var i=0; i < arrWithnumbers.length; i++) {
for (var j=i+1; j<arrWithnumbers.length; j++) {
if(arrWithnumbers[i]===arrWithnumbers[j]
{
firstIndex  = i;
break;
}
}
if(firstIndex >-1) break;
}
console.log(firstIndex);
0

Co oznacza powtarza się jako pierwsza?
[1, 2, 2, 1] - wynikiem ma być 1 czy 2?

0
neves napisał(a):
var arrWithnumbers = [6, 4, 9, 2, 1, 5, 1, 2, 9, 7];
var firstIndex = -1;
for (var i=0; i < arrWithnumbers.length; i++) {
for (var j=i+1; j<arrWithnumbers.length; j++) {
if(arrWithnumbers[i]===arrWithnumbers[j]
{
firstIndex  = i;
break;
}
}
if(firstIndex >-1) break;
}
console.log(firstIndex);

Działa, dziękuję :)

0
Maciej Cąderek napisał(a):

Co oznacza powtarza się jako pierwsza?
[1, 2, 2, 1] - wynikiem ma być 1 czy 2?

Tablica wygląda tak: [6, 4, 9, 2, 1, 5, 1, 2, 9, 7], więc wynikiem powinna być cyfra 2, bo jako pierwsza się powtarza

0
Skromny Ogórek napisał(a):
Maciej Cąderek napisał(a):

Co oznacza powtarza się jako pierwsza?
[1, 2, 2, 1] - wynikiem ma być 1 czy 2?

Tablica wygląda tak: [6, 4, 9, 2, 1, 5, 1, 2, 9, 7], więc wynikiem powinna być cyfra 9, bo jako pierwsza się powtarza

0
Skromny Ogórek napisał(a):
neves napisał(a):
var arrWithnumbers = [6, 4, 9, 2, 1, 5, 1, 2, 9, 7];
var firstIndex = -1;
for (var i=0; i < arrWithnumbers.length; i++) {
for (var j=i+1; j<arrWithnumbers.length; j++) {
if(arrWithnumbers[i]===arrWithnumbers[j]
{
firstIndex  = i;
break;
}
}
if(firstIndex >-1) break;
}
console.log(firstIndex);

Działa, dziękuję :)
Jednak nie, wypisuje 2 :(

0
Skromny Ogórek napisał(a):

Jednak nie, wypisuje 2 :(

A co ma wg Ciebie wypisać - w zadaniu jest napisane, że ma wypisać indeks, nie wartość.

0

Trochę lżejsze (i prostsze) rozwiązanie:

const arr = [6, 4, 9, 2, 1, 5, 1, 2, 9, 7]

let firstIndex = -1

for (let i = 0; i < arr.length; i++) {
  if (arr.includes(arr[i], i + 1)) {
    firstIndex = i
    break
  }
}

console.log(firstIndex)

W przestarzałym standardzie:

var arr = [6, 4, 9, 2, 1, 5, 1, 2, 9, 7]
 
var firstIndex = -1
 
for (var i = 0; i < arr.length; i++) {
  if (arr.indexOf(arr[i], i + 1) !== -1) {
    firstIndex = i
    break
  }
}
 
console.log(firstIndex)

Jako funkcja (lepiej):

const x = [6, 4, 9, 2, 1, 5, 1, 2, 9, 7]

function firstDuplicateIndex (arr) {
  for (let i = 0; i < arr.length; i++) {
    if (arr.includes(arr[i], i + 1)) {
      return i
    }
  }
  
  return -1
}

console.log(firstDuplicateIndex(x))

Dla tablic dowolnej wielkości (złożoność liniowa):

function firstDuplicateIndex (arr) {
  const occurences = []
  const addresses = {}

  for (let i = 0; i < arr.length; i++) {
    const val = arr[i]

    if (addresses[val] === undefined) {
      addresses[val] = i
    }
    
    const address = addresses[val]
    
    if (occurences[0] > 1) {
      return 0
    }
    
    occurences[address] = occurences[address]
      ? occurences[address] + 1
      : 1
  }

  return occurences.findIndex(x => x > 1)
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1