2017-07-21 66 views
8

Pracuję nad wyzwaniem, w którym muszę znaleźć najmniejszą wartość w tablicy i móc ją policzyć, jeśli liczba występuje więcej niż raz. Myślę, że mam format w dół, ale daje mi to jeszcze jedną liczbę, niż liczb (4 zamiast 3). Czy ktoś może mi dać wskazówki? Doceniamy każdą pomoc!Policz tę samą wartość w tablicy

function small(array) { 
 
    var smallest = array[0]; 
 
    var count = 0; 
 
    for(var i = 0; i < array.length; i++) { 
 
    if(array[i] < smallest) { 
 
     smallest = array[i]; 
 
    } 
 
    if(smallest===array[i]) { 
 
     count++; 
 
    } 
 
    } 
 
    return count; 
 
} 
 

 
small([5,6,2,2,2]);

Odpowiedz

4

gdy dostaniesz nowy najmniejszy, a następnie zresetować jest wymagane.

Dlaczego należy resetować licznik do 0, nie 1?

ponieważ warunkiem jest sprawdzenie z najmniejszą === arr [i], oznacza, że ​​sprawdzają sam element, który został zapisany teraz

function small(array){ 
 
    var smallest = array[0]; 
 
    var count = 0; 
 
    for(var i = 0; i < array.length; i++) { 
 
     if(array[i] < smallest) { 
 
      smallest = array[i]; 
 
      count = 0; 
 
     } 
 
     if(smallest===array[i]) { 
 
      count++; 
 
     } 
 
    } 
 
    return count; 
 
} 
 
console.log(small([5,6,2,2,2]));

+0

@Kaps Thanks dużo! resetowanie go do 0 działało. Jaka jest logika tego? Ponieważ był już ustawiony na 0 – grasshopper

+0

@grasshopper, gdy tylko otrzymasz nowy najmniejszy, wymagany jest reset. Dlaczego jego 0 nie 1.ponieważ masz późniejszy warunek, który jest sprawdzany z najmniejszym === arr [i], oznacza, że ​​sprawdzasz ten sam element, który zapisałeś teraz – Kaps

+0

@ YuvalBen-Arie suchy uruchom go z resetem 1 dowiesz się, dlaczego 0 nie 1. – Kaps

0

Należy ustawić count 0 jeśli zastąpić smallest

function small(array){ 
    var smallest = array[0]; 
    var count = 0; 
    for(var i = 0; i < array.length; i++) { 
     if(array[i] < smallest) { 
      smallest = array[i]; 
      count = 0; 
     } 
     if(smallest===array[i]) { 
      count++; 
     } 
    } 
    return count; 
} 
small([5,6,2,2,2]); 
2

można korzystać z dwóch pętli tutaj i najpierw uzyskać najmniejszą liczbę, a następnie policzyć ile razy występuje. Złożoność czasu nadal będzie O (n).

function small(array){ 
 
    var smallest = array[0]; 
 
    var count = 0; 
 
    for(var i = 0; i < array.length; i++) { 
 
     if(array[i] < smallest) { 
 
      smallest = array[i]; 
 
     } 
 
    } 
 
    for(var i=0; i<array.length; i++){ 
 
     if(smallest===array[i]) { 
 
      count++; 
 
     } 
 
    } 
 
    return count; 
 
} 
 
console.log(small([5,6,2,2,2]));

0

ustawić najmniejszych do

array[0] 

i jeśli instrukcja mówi:

smallest = array[i] 

To zawsze prawda. Musisz ustawić najmniejsze = 0 lub najmniejsze = 1.

1

po raz pierwszy uruchamia pętli, smallest to pierwszy element w tablicy, jak to, w jaki sposób zadeklarować

var smallest = array[0]; 

Tak na pierwszy iteracja, smallest jest już 5, podobnie jak array[i], ponieważ obecnie jest to również array[0], tutaj zaczyna się pętla, więc są one takie same, co oznacza, że ​​warunek jest prawdziwy w pierwszej iteracji, a liczba zwiększa się.

Naprawdę myślisz o tym w niewłaściwy sposób.
Najłatwiej byłoby użyć Math.min znaleźć najmniejszą liczbę w tablicy, a potem po prostu filtrować tablicy w oparciu o to, i zobaczyć, ile indeksy pozostają

function small(arr) { 
 
    let min = Math.min.apply(null, arr); 
 
    return arr.filter(val => val === min).length; 
 
} 
 

 
console.log(small([5, 6, 2, 2, 2]));

+0

Czy nie przeliczyłoby to minimalnie wszystkich liczb całkowitych dla każdego elementu w tablicy? (w przeciwieństwie do przechowywania minimum) – pinkfloydx33

+0

Nie, nie, ale mogę się upewnić, że to nie problem, używając trzeciego argumentu dla 'Array.filter' – adeneo

+0

Co mam na myśli to, że wywołanie zwrotne filtra jest wykonywane dla każdego elementu w oryginalnej tablicy. Wewnątrz tego wywołania zwrotnego wywołujesz funkcję (Math.min). W jaki sposób każde wywołanie zwrotnego filtru nie wywołuje Math.min, co z kolei obliczy ponownie minimalne (aczkolwiek zawsze taki sam wynik) dla całej tablicy? Czy może czegoś tutaj brakuje? – pinkfloydx33