På tre måder kan du finde det største tal i en matrix ved hjælp af JavaScript
I denne artikel vil jeg forklare, hvordan man løser Free Code Camps "Returner største numre i arrays " -udfordring. Dette indebærer at returnere en matrix med de største tal fra hver af underarrayerne.
Der er de tre tilgange, jeg vil dække:
- med en FOR-loop
- ved hjælp af reducere () metoden
- ved hjælp af Math.max ()
Algoritmeudfordringsbeskrivelsen
Returner en matrix bestående af det største antal fra hver leverede undergruppe. For at gøre det nemmere vil den leverede matrix indeholde nøjagtigt 4 underarrays.Husk, du kan gentage gennem en matrix med en enkel for loop og få adgang til hvert medlem med array-syntaks arr [i].
function largestOfFour(arr) { return arr; } largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
Medfølgende testtilfælde
largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]) should return an array. largestOfFour([[13, 27, 18, 26], [4, 5, 1, 3], [32, 35, 37, 39], [1000, 1001, 857, 1]]) should return [27,5,39,1001]. largestOfFour([[4, 9, 1, 3], [13, 35, 18, 26], [32, 35, 97, 39], [1000000, 1001, 857, 1]]) should return [9, 35, 97, 1000000].
Tilgang nr. 1: Returner de største numre i en matrix med en for løkke
Her er min løsning med indlejrede kommentarer, der hjælper dig med at forstå det:
function largestOfFour(arr) { // Step 1. Create an array that will host the result of the 4 sub-arrays var largestNumber = [0,0,0,0]; // Step 2. Create the first FOR loop that will iterate through the arrays for(var arrayIndex = 0; arrayIndex < arr.length; arrayIndex++) { /* The starting point, index 0, corresponds to the first array */ // Step 3. Create the second FOR loop that will iterate through the sub-arrays for(var subArrayIndex = 0; subArrayIndex largestNumber[arrayIndex]) { largestNumber[arrayIndex] = arr[arrayIndex][subArrayIndex]; /* FOR loop cycles arrayIndex => i subArrayIndex => j Iteration in the first array For each iteration: arr[i][j] largestNumber[i] if arr[i][j] > largestNumber[i]? then largestNumber[i] = arr[i][j] First iteration: arr[0][0] => 4 largestNumber[0] => 0 4 > 0? => TRUE then largestNumber[0] = 4 Second iteration: arr[0][1] => 5 largestNumber[0] => 4 5 > 4? => TRUE then largestNumber[0] = 5 Third iteration: arr[0][2] => 1 largestNumber[0] => 5 1 > 5? => FALSE then largestNumber[0] = 5 Fourth iteration: arr[0][3] => 3 largestNumber[0] => 5 3 > 5? => FALSE then largestNumber[0] = 5 Fifth iteration: arr[0][4] => FALSE largestNumber[0] => 5 largestNumber = [5,0,0,0] Exit the first array and continue on the second one Iteration in the second array For each iteration: arr[i][j] largestNumber[i] if arr[i][j] > largestNumber[i]? then largestNumber[i] = arr[i][j] First iteration: arr[1][0] => 13 largestNumber[1] => 0 13 > 0? => TRUE then largestNumber[1] = 13 Second iteration: arr[1][1] => 27 largestNumber[1] => 13 27 > 13? => TRUE then largestNumber[1] = 27 Third iteration: arr[1][2] => 18 largestNumber[1] => 27 18 > 27? => FALSE then largestNumber[1] = 27 Fourth iteration: arr[1][3] => 26 largestNumber[1] => 27 26 > 27? => FALSE then largestNumber[1] = 27 Fifth iteration: arr[1][4] => FALSE largestNumber[1] => 27 largestNumber = [5,27,0,0] Exit the first array and continue on the third one Iteration in the third array For each iteration: arr[i][j] largestNumber[i] if arr[i][j] > largestNumber[i]? then largestNumber[i] = arr[i][j] First iteration: arr[2][0] => 32 largestNumber[2] => 0 32 > 0? => TRUE then largestNumber[2] = 32 Second iteration: arr[2][1] => 35 largestNumber[2] => 32 35 > 32? => TRUE then largestNumber[2] = 35 Third iteration: arr[2][2] => 37 largestNumber[2] => 35 37 > 35? => TRUE then largestNumber[2] = 37 Fourth iteration: arr[2][3] => 39 largestNumber[2] => 37 39 > 37? => TRUE then largestNumber[2] = 39 Fifth iteration: arr[2][4] => FALSE largestNumber[2] => 39 largestNumber = [5,27,39,0] Exit the first array and continue on the fourth one Iteration in the fourth array For each iteration: arr[i][j] largestNumber[i] if arr[i][j] > largestNumber[i]? then largestNumber[i] = arr[i][j] First iteration: arr[3][0] => 1000 largestNumber[3] => 0 1000 > 0? => TRUE then largestNumber[3] = 1000 Second iteration: arr[3][1] => 1001 largestNumber[3] => 1000 1001 > 1000? => TRUE then largestNumber[3] = 1001 Third iteration: arr[3][2] => 857 largestNumber[3] => 1001 857 > 1001? => FALSE then largestNumber[3] = 1001 Fourth iteration: arr[3][3] => 1 largestNumber[3] => 1001 1 > 1001? => FALSE then largestNumber[3] = 1001 Fifth iteration: arr[3][4] => FALSE largestNumber[3] => 1001 largestNumber = [5,27,39,1001] Exit the FOR loop */ } } } // Step 4. Return the largest numbers of each sub-arrays return largestNumber; // largestNumber = [5,27,39,1001]; } largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
Og her er det uden mine kommentarer:
function largestOfFour(arr) { var largestNumber = [0,0,0,0]; for(var arrayIndex = 0; arrayIndex < arr.length; arrayIndex++) { for(var subArrayIndex = 0; subArrayIndex largestNumber[arrayIndex]) { largestNumber[arrayIndex] = arr[arrayIndex][subArrayIndex]; } } } return largestNumber; } largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
Fremgangsmåde nr. 2: Returner de største tal i en matrix med indbyggede funktioner - med kort () og reducer ()
Til denne løsning bruger du to metoder: Metoden Array.prototype.map () og Array.prototype.reduce () -metoden.
- Den kortet () metode skaber en ny array med resultaterne af at kalde en forudsat funktion på hvert enkelt element i dette array. Brug af kort kalder en leveret tilbagekaldsfunktion én gang for hvert element i en matrix i rækkefølge og konstruerer et nyt array ud fra resultaterne.
- Metoden reducere () anvender en funktion mod en akkumulator og hver værdi i arrayet for at reducere den til en enkelt værdi.
Den ternære operatør er den eneste JavaScript-operatør, der tager tre operander. Denne operatør bruges som en genvej til if-sætningen.
(currentLargestNumber > previousLargestNumber) ? currentLargestNumber : previousLargestNumber;
Dette kan også læses som:
if (currentLargestNumber > previousLargestNumber == true) { return currentLargestNumber; } else { return previousLargestNumber; }
Her er min løsning med indlejrede kommentarer:
function largestOfFour(mainArray) { // Step 1. Map over the main arrays return mainArray.map(function (subArray){ // Step 3. Return the largest numbers of each sub-arrays => returns [5,27,39,1001] // Step 2. Grab the largest numbers for each sub-arrays with reduce() method return subArray.reduce(function (previousLargestNumber, currentLargestNumber) { return (currentLargestNumber > previousLargestNumber) ? currentLargestNumber : previousLargestNumber; /* Map process and Reduce method cycles currentLargestNumber => cLN previousLargestNumber => pLN Iteration in the first array For each iteration: cLN pLN if (cLN > pLN) ? then cLN else pLN First iteration: 4 0 4 > 0? => TRUE 4 / Second iteration: 5 4 5 > 4? => TRUE 5 / Third iteration: 1 5 1 > 5? => FALSE / 5 Fourth iteration: 3 5 3 > 5? => FALSE / 5 Fifth iteration: / 5 returns 5 Exit the first array and continue on the second one Iteration in the second array For each iteration: cLN pLN if (cLN > pLN) ? then cLN else pLN First iteration: 13 0 13 > 0? => TRUE 13 / Second iteration: 27 13 27 > 13? => TRUE 27 / Third iteration: 18 27 18 > 27? => FALSE / 27 Fourth iteration: 26 27 26 > 27? => FALSE / 27 Fifth iteration: / 27 returns 27 Exit the first array and continue on the third one Iteration in the third array For each iteration: cLN pLN if (cLN > pLN) ? then cLN else pLN First iteration: 32 0 32 > 0? => TRUE 32 / Second iteration: 35 32 35 > 32? => TRUE 35 / Third iteration: 37 35 37 > 35? => TRUE 37 / Fourth iteration: 39 37 39 > 37? => TRUE 39 / Fifth iteration: / 39 returns 39 Exit the first array and continue on the fourth one Iteration in the fourth array For each iteration: cLN pLN if (cLN > pLN) ? then cLN else pLN First iteration: 1000 0 1000 > 0? => TRUE 1000 / Second iteration: 1001 1000 1001 > 1000? => TRUE 1001 / Third iteration: 857 1001 857 > 1001 => FALSE / 1001 Fourth iteration: 1 1001 1 > 1001? => FALSE / 1001 Fifth iteration: / 1001 returns 1001 Exit the first array and continue on the fourth one */ }, 0); // 0 serves as the context for the first pLN in each sub array }); } largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
Og her er det uden kommentarer:
function largestOfFour(mainArray) { return mainArray.map(function (subArray){ return subArray.reduce(function (previousLargestNumber, currentLargestNumber) { return (currentLargestNumber > previousLargestNumber) ? currentLargestNumber : previousLargestNumber; }, 0); }); } largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
Fremgangsmåde 3: Returner de største numre i en matrix med indbyggede funktioner - med kort () og anvend ()
Til denne løsning bruger du to metoder: Array.prototype.map () -metoden og Function.prototype.apply () -metoden.
- Metoden Apply () kalder en funktion med en given denne værdi og argumenter leveret som et array (eller et array-lignende objekt).
Du kan videregive en række argumenter til en funktion ved hjælp af metoden Apply () , og funktionen udfører elementerne i arrayet.
Sådanne funktioner kaldes variadiske funktioner , og de kan acceptere et vilkårligt antal argumenter i stedet for en fast.
Den Math.max () -funktionen giver den største af nul eller flere numre, og vi kan passere et vilkårligt antal argumenter.
console.log(Math.max(4,5,1,3)); // logs 5
Men du kan ikke videregive en række numre til metoden som denne:
var num = [4,5,1,3]; console.log(Math.max(num)); // logs NaN
Det er her, hvor anvendelse () -metoden viser sig at være nyttig:
var num = [4,5,1,3]; console.log(Math.max.apply(null, num)); // logs 5
Bemærk, at det første argument, der skal anvendes (), indstiller værdien af ' dette ', ikke brugt i denne metode, så du videregiver null .
Nu hvor du har en metode til at returnere det største tal i en matrix, kan du løbe gennem hver underarray med map () -metoden og returnere alle største tal.
Her er min løsning med indlejrede kommentarer:
function largestOfFour(mainArray) { // Step 1. Map over the main arrays return mainArray.map(function(subArray) { // Step 3. Return the largest numbers of each sub-arrays => returns [5,27,39,1001] // Step 2. Return the largest numbers for each sub-arrays with Math.max() method return Math.max.apply(null, subArray); }); } largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
Og uden kommentarer:
function largestOfFour(mainArray) { return mainArray.map(function(subArray) { return Math.max.apply(null, subArray); }); } largestOfFour([[4, 5, 1, 3], [13, 27, 18, 26], [32, 35, 37, 39], [1000, 1001, 857, 1]]);
Jeg håber, du fandt dette nyttigt. Dette er en del af min "How to Solve FCC Algorithms" -serie om artikler om Free Code Camp Algorithm Challenges, hvor jeg foreslår flere løsninger og forklarer trin for trin, hvad der sker under emhætten.
Tre måder at gentage en streng i JavaScript
I denne artikel vil jeg forklare, hvordan man løser freeCodeCamp's "Gentag en streng gentag en streng" -udfordring. Dette involverer ...
To måder at bekræfte afslutningen på en streng i JavaScript
I denne artikel forklarer jeg, hvordan man løser freeCodeCamp's "Confirm the Ending" -udfordring.
Tre måder at vende en streng i JavaScript
Denne artikel er baseret på Free Code Camp Basic Algorithm Scripting “Vend en streng”
Tre måder at faktorisere et nummer i JavaScript
Denne artikel er baseret på Free Code Camp Basic Algorithm Scripting “Faktoriser et tal”
To måder at kontrollere palindromer i JavaScript
Denne artikel er baseret på Free Code Camp Basic Algorithm Scripting “Check for Palindromes”.
Tre måder at finde det længste ord i en streng i JavaScript
Denne artikel er baseret på Free Code Camp Basic Algorithm Scripting "Find det længste ord i en streng".
Tre måder at betegne sag på en sætning i JavaScript
Denne artikel er baseret på Free Code Camp Basic Algorithm Scripting "Titel sag en sætning".
Hvis du har din egen løsning eller forslag, så del dem nedenfor i kommentarerne.
Eller du kan følge mig på Medium , Twitter, Github og LinkedIn lige efter at du har klikket på det grønne hjerte nedenfor ;-)
# StayCurious, # KeepOnHacking & # MakeItHappen!
Yderligere ressourcer
- til - MDN
- array.length - MDN
- map () metode - MDN
- reducere () metode - MDN
- Ternær operatør - MDN
- anvend () metode - MDN
- Math.max () - MDN
- dette - MDN