Iterative Lösung zum Reduzieren von n-ten verschachtelten Arrays in Javascript

7

Kann mir jemand eine iterative Lösung für das folgende Problem zeigen? Ich löste es rekursiv, kämpfte aber mit einer iterativen Lösung. (Facebook Technical Interview Frage)

%Vor%

Die Lösung muss mit n-ten geschachtelten Array-Elementen arbeiten (d. h., sie muss immer noch funktionieren, wenn jemand die Array-Werte / Platzierung im obigen Beispiel ändert)

Rekursive Lösung:

%Vor%     
subject117 01.05.2015, 16:33
quelle

7 Antworten

7

Hier ist eine Möglichkeit:

%Vor%

Erklärung: Wenn Sie über eine verschachtelte Struktur iterieren, müssen Sie sich nur daran erinnern, wo Sie vorher waren, indem Sie das aktuelle Array und die Position speichern, bevor Sie in das verschachtelte Array wechseln Stapel für rekursive Lösungen).

Hinweis: Wenn Sie die Arrays placeHolder und lastIndex erneut verwenden, müssen Sie sie nicht jedes Mal neu erstellen. Vielleicht in etwa so:

%Vor%

Dies ist sogar noch schneller (für flache Iteration), und weniger Garbage-Collector-Probleme, die es viele Male aufrufen. Die Geschwindigkeit liegt sehr nahe bei der rekursiven Funktion, die in Chrome aufgerufen wird, und oft schneller als die Rekursion in FireFox und IE.

Ich habe Tomalaks Tests hier neu erstellt, da der alte jsPerf zur Bearbeitung nicht mehr funktioniert: Ссылка

    
James Wilkins 01.05.2015, 17:27
quelle
4

Wie wäre es damit?

%Vor%
    
georg 01.05.2015 17:37
quelle
3
%Vor%

Diese In-Place-Lösung ist schneller als die von Lupe, jetzt da ich alle inneren geschweiften Klammern entfernt habe (ich habe die i-- in den concat-Parameter eingefügt, um das zu tun).

    
Rick Edwards 09.11.2017 23:45
quelle
2

Funktioniert, aber nicht empfohlen:

%Vor%     
L3viathan 01.05.2015 16:50
quelle
2

Hier ist eine Lösung, die sich an Ort und Stelle verflacht.

%Vor%

Diese Lösung durchläuft das Array und verflacht jedes Element um eine Ebene der Verschachtelung, bis es nicht mehr abgeflacht werden kann.

    
Lope 15.07.2017 18:24
quelle
1

Ein anderer iterativer Algorithmus:

%Vor%
  • Platziere alle Elemente auf einem Stapel.
  • Entfernen Sie das erste Element, während der Stapel nicht leer ist.
    • Wenn dieses Element ein Skalar ist, fügen Sie es zur Ausgabe hinzu.
    • Wenn dieses Element ein Array ist, teilen Sie es in head (erstes Element) und tail (verbleibende Elemente) und fügen Sie beide zum Stack hinzu.

Wie Tomalaks JSPerf zeigt, ist das ziemlich langsam.

JSBin

    
joews 01.05.2015 16:59
quelle
0

Ein ziemlich übersichtlicher, lesbarer Algorithmus:

%Vor%

Diese Version schneidet besser ab als meine andere Antwort , ist aber immer noch deutlich langsamer als James Wilkins 'Antwort .

JSBin

Tomalaks JSPerf

    
joews 01.05.2015 20:55
quelle

Tags und Links