• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Zadanie - pętla zagnieżdżona

Object Storage Arubacloud
0 głosów
856 wizyt
pytanie zadane 24 lutego 2018 w JavaScript przez patrykps Nowicjusz (140 p.)
edycja 24 lutego 2018 przez ScriptyChris

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);

Macie jakieś pomysły? Byłbym bardzo wdzięczny

2 odpowiedzi

+1 głos
odpowiedź 24 lutego 2018 przez Tomek Sochacki Ekspert (227,510 p.)

Jedna z propozycji z użyciem pętli for:

const firstDuplicate = numbers => {
	for(let i = 0, max = numbers.length; i < max; i++) {
		const current = numbers[i];
		if(numbers.indexOf(current) !== numbers.lastIndexOf(current)) {
			return i;
		}
	}
	return 'Brak powtarzających się elementów.';
};

firstDuplicate([2,4,5,2,3,5,1,2,4]); //0
firstDuplicate([1,2,3,2,4,5]);       //1
firstDuplicate([1,2,3,2,3,2,3]);     //1
firstDuplicate([1,5,3,2,3,2,3]);     //2
firstDuplicate([1,2,3,4,5]); //"Brak powtarzających się elementów."

albo inny wariant rozwiązania tego samego problemu bez zabawy z pętlą for:

const firstDuplicate2 = numbers => {
	const first = numbers.findIndex((n,i) => {
		return numbers.slice(i+1).includes(n);
	});
	return (first !== -1) ? first : 'Brak powtarzających się elementów.';
};

firstDuplicate2([2,4,5,2,3,5,1,2,4]); //0
firstDuplicate2([1,2,3,2,4,5]);       //1
firstDuplicate2([1,2,3,2,3,2,3]);     //1
firstDuplicate2([1,5,3,2,3,2,3]);     //2
firstDuplicate2([1,2,3,4,5]); //"Brak powtarzających się elementów."

Wcale nie potrzebujesz dwóch pętli for, co więcej wg mnie to nie ma zupełnie sensu aby tak robić. W pierwszym przykładzie analizuję czy kolejny element ma swojego sobowtóra i jeśli tak to przerywam pętelkę i zwracam index tego elementu. 

Drugi przykład robi to samo ale w nieco inny sposób, a mianowicie przeszukuję tablicę i przy każdym elemencie w dużym analizuję, czy jeśli na tym elemencie uciąć by tablicę to czy w dalszej jej części znajduje się co najmniej jedno wystąpienie tego elementu. Jeśli tak, to znaczy, że mamy sobowtóra. Tylko mała uwaga, findIndex zwróci albo index dopasowanego elementu albo -1, dlatego to dodatkowe sprawdzenie w instrukcji return.

1
komentarz 24 lutego 2018 przez ScriptyChris Mędrzec (190,190 p.)
edycja 25 lutego 2018 przez ScriptyChris

@Tomek dał lepsze propozycje, to ja jeszcze dorzucę z reduce:

const arrWithNumbers = [ 6, 4, 9, 2, 1, 5, 1, 2, 9, 7 ];
const firstIndex = arrWithNumbers.reduce( ( acc, val, i, arr ) => {
	return acc = ( arr.indexOf( val, i ) !== -1 && !acc ) ? val : acc;
}, 0);

@kap, tak, jest błąd: zamiast arr.indexOf( val, i ) powinno być arr.indexOf( val, i + 1 )

komentarz 25 lutego 2018 przez kap Stary wyjadacz (11,620 p.)

@JSHolic  Spoko, ale to robi zupełnie co innego

komentarz 25 lutego 2018 przez kap Stary wyjadacz (11,620 p.)
edycja 25 lutego 2018 przez kap

@{Tomek Sochacki

Jeszcze tylko dodam, że jakbyśmy mieli do czynienia z większymi tablicami to trzeba zastosować zupełnie inne podejście, ze względu na złożoność obiczeniową (czasową):
https://jsperf.com/first-duplicate-index

komentarz 25 lutego 2018 przez kap Stary wyjadacz (11,620 p.)
A zwracanie z funkcji -1 jest imo lepszym rozwiązaniem niż zwracanie wartości innego typu (stringa z komunikatem) - zresztą to standard dla działań na indeksach (jak widać w metodach wbudowanych).
2
komentarz 25 lutego 2018 przez Tomek Sochacki Ekspert (227,510 p.)

@kap:

1 - co do złożoności obliczeniowej to zgadzam się, ja moje rozwiązania zrobiłem takie dlatego, aby Kolega mógł się poduczyć paru elementów języka :) Skoro jest na początku nauki to nie wchodziłbym w wielkie optymalizacje itp. najpierw trzeba zrozumieć co i jak, żeby wiedzieć jak potem szukać optymalnego algorytmu. Ale nie podważam oczywiście faktu, że pewnie moje rozwiązania nie są najwydajniejsze.

2 - tutaj wszystko zależy od tego co ta funkcja ma dalej robić w aplikacji. Zgadzam się, że dobrze jest zawsze zwracać ten sam typ wartości, czyli tak jak piszesz w razie nieznalezienia zwrócić -1. Ja celowo zrobiłem inaczej aby wyraźnie wskazać w funkcji TO MIEJSCE gdzie dochodzi do nie znalezienia elementu. Ale tutaj również podtrzymuję Twoją opinię, że w kodzie produkcyjnym lepiej aby funkcja zwróciła -1 niż string. Jeśli nawet zaszłaby konieczność innego zareagowania na brak elementu to warto wg mnie rozważyć np. zwrócenie Error co pozwoli to przechwycić w try-catch, ale to tylko w pewnych wyjątkowych przypadkach, najczęściej w tej funkcji lepszy byłby zwrot -1 (jako number, bo ważne jest też zachowanie typu wartości).

Dzięki za wspólną analizę, myślę, że Kolega co nie co będzie miał do rozkminienia i nauki :)

Pozdrawiam

0 głosów
odpowiedź 24 lutego 2018 przez ScriptyChris Mędrzec (190,190 p.)

j===arrWithnumbers

Czemu ma służyć ten zapis? :) Porównujesz liczbę z tablicą. Ten warunek (przy użyciu potrójnego operatora porównania) zawsze będzie fałszywy.

Stwórz sobie pomocniczą tablicę, niech na początku będzie pusta. W pętli sprawdzaj, czy aktualna liczba z pierwszej tablicy znajduje się w drugiej - rób to w pętli, gdzie masz iterator j - jeśli nie, dorzuć tą liczbę do drugiej tablicy, jeśli tak to przypisz ją do firstIndex i przerwij pętle.

Podobne pytania

+1 głos
2 odpowiedzi 166 wizyt
0 głosów
0 odpowiedzi 107 wizyt
0 głosów
1 odpowiedź 404 wizyt
pytanie zadane 25 lutego 2018 w C i C++ przez Piotr_Minda Początkujący (380 p.)

92,576 zapytań

141,426 odpowiedzi

319,652 komentarzy

61,961 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...