In den letzten Tagen suche ich in Shanghai nach kühlem Wetter von 40 °. Ich fühle mich so glücklich. Jedes Mal, wenn ich interviewe, muss ich lange dort sitzen und lange schwitzen, bevor ich zu meinen Sinnen zurückkehren kann. Ich fühle die tiefe Liebe der Welt für mich. Ich bin zum Thema zurückgekommen. Während des Interviews stieß ich auf mehrere schriftliche Tests. Es gibt eine Frage. Da ich es in meiner tatsächlichen Arbeit nie begegnet habe, achte ich darauf. Die Frage ist wie folgt:
Es gibt ein Array: var arr = [1,2,1,3,3,2,4,6,3], was durch Verarbeitung in eine Normalverteilung geändert wird: [1,2,3,6,4,3,2,1].
Ich werde kurz die Normalverteilung erklären. Tatsächlich können Sie das verarbeitete Array grob verstehen. Die beiden Enden sind klein und die Mitte ist groß. Die in der Koordinatenachse reflektierte normale Kurve ist tickend und beide Enden niedrig und mittlere hoch. Die linke und rechte symmetrisch, weil seine Kurven glockenförmig sind, so dass die Leute es oft tickförmige Kurven nennen.
Dies ist die letzte Frage für das Interview. Als ich es hier bekam, war ich eng und das Wetter war heiß, durstig und hungrig. Das Mädchen in der Rezeption sah so gut aus (hör auf, Unsinn zu reden, es war, weil der Algorithmus schwach war ...). Nach einem kleinen Gedanken schrieb ich den folgenden Code:
var arr = [1,2,1,3,3,2,4,6,3] ~(function(arr) { var temp = [], i = 0, l = arr.length, sortArr = arr.sort(function(a,b){return ab}) //First arrange the array from small to large to obtain [1, 1, 2, 2, 3, 3, 3, 4, 6]for (;i<l;i++){ if (i%2 == 0) {temp [i/2] = sortarr [i] // Legen Sie die Indexs in die Vorderseite in die Reihenfolge der gleichmäßigen Zahlen} else {temp [l- (i+1)/2] = sortarr [i] // Sortieren Sie die Subscripte nach hinten nach hinten in der Reihenfolge von Odd Nummern}}. perfekt}) (arr)Da es sich um einen schriftlichen Test handelte, habe ich das Programm für eine Weile in meinem Kopf und das Gefühl, dass es kein großes Problem gab und das Papier übergab. Später betrachtete der Interviewer das Testpapier und erwähnte diese Frage während des Interviews nicht. Also hatte ich das Gefühl, dass es mit dieser Methode kein Problem gab, also habe ich während des Interviews nicht wieder gefragt. Auf dem Rückweg dachte ich jedoch plötzlich an eine Situation wie diese:
var arr = [1,2,3,4,5,6,7,8,9] // ein reguläres inkrementierendes Array ~ (Funktion (arr) {var temp = [], i = 0, l = arr.Length, sortarr = arr.sort (function (a, b) {return ab}) für (; i <l; i ++) {i%2 == 0). {temp [l- (i+1)/2] = sortarr [i]}} console.log (temp) // [1, 3, 5, 7, 9, 6, 4, 2] Das Problem ist aufgetreten.Ja, auf diese Weise sind die linken und rechten Teile dieses Arrays nicht symmetrisch, mit 9 als Mitte, mit 1+3+5+7 = 16 links und 2+4+6+8 = 20 rechts. Es ist offensichtlich, dass die Linke leicht und die rechte schwer ist, keine gleichmäßige Normalverteilung. Wenn das Array wächst, werden die Probleme immer ernster.
Liniengurte. . . . Ich bin eine Knospe, die im Begriff ist zu blühen. Behandle mich nicht so. . .
Es scheint, dass der vorherige Code nicht verwendet werden kann, sodass ich die Lösung nur überdenken kann. Tatsächlich besteht der Kern des Problems darin, sicherzustellen, dass die linke und die rechte Seite des Arrays gleich oder ungefähr gleich sind. Unabhängig davon, ob es sich um ein Array von ungeraden Zahlen oder sogar Zahlen handelt, kann das Array in zwei Teile unterteilt werden (der Maximalwert der ungeraden Zahlen kann auch als gleichmäßiges Zahlenarray angesehen werden. Auch wenn es mehrere identische maximale Werte gibt, spielt es keine Rolle. Nach dem Sortieren von klein nach groß ist es nur das Letzte entfernen. Oder setzen Sie es nach der obigen Methode auf die linke und rechte Seite, wenn es seltsam ist, auf die rechte Seite. Vergleichen Sie beim Anbau des Arrays auf der linken und rechten Seite, wenn die Längen des Arrays gleich sind, die Summe der linken und rechten Seite. Da es unter normalen Umständen von klein bis groß angeordnet ist, ist die rechte Seite größer als die linke Seite und tauschen Sie dann den ersten und die letzte auf der linken Seite aus, um den Zweck des Gleichgewichts zu erreichen. Der Code ist wie folgt:
var arr = [1,2,3,4,5,6,7,8,9], sortarr = arr.sort (function (a, b) {return ab}), l = arr.länge, temp_left = [], temp_right = [] Funktionsart (arr) {var i = 0 für (; i <l; i ++) {var eq = sortar. temp_left.push(eq) : temp_right.unshift(eq) if(i > 1){ if( temp_left.length == temp_right.length && !compare(temp_left, temp_right)){ wrap(temp_left,temp_right) // When the array is equal and the right and the right are greater than the left side are exchanged} } } return temp_left.concat (temp_right)} // Array -Summenfunktion Summe (arr) {return eval (arr.join ("+")); } // Array -Vergleichsfunktion Compare (arr1, arr2) {return sum (arr1)> = sum (arr2)} // Der letzte an der linken Börse mit der ersten auf der rechten Funktionswrap (l, r) {var m = r.shift () r.unshift (l.pop ()) l.push (m)} console (sorthift (sorthift (arrsoles)). 5, 3, 2]Auf diese Weise ist die gesamte Normalverteilung viel gleichmäßiger. Führen Sie noch ein paar Tests von Tests durch, um den Effekt zu sehen:
arr = [1,333,444,555,66,7788,909] Konsole.log (sortieren (arr)) // [1,444,909, 7788,555,333,66] arr = [168.6,177.5,174.2,189.3,167.2,177.6,167.8,175.5]console.log(sort(arr)) //[167.2,174.2,175.5,189.3,177.6,177.5,168.6,167.8]
Es sieht ziemlich gut aus. Es gibt einen weiteren Artikel in der kleinen Site, auf die angesichts der Anzeige geklickt wurde, die in C ++ abgeschlossen wurde. Das Endergebnis des Artikels war jedoch keine einheitliche Normalverteilung, sondern ähnlich wie bei meinem ersten Programm.
Ich weiß nicht viel über C ++ und ich habe nicht mehrere Ergebnisse von Ergebnissen ausgeführt. Interessierte Schüler können es als Vergleich versuchen.
Ich habe nur alle Programme in diesem Artikel in Chrome getestet. Wenn es Probleme mit anderen Browsern gibt, hoffe ich, eine Nachricht zu hinterlassen, um Sie zu informieren. Tatsächlich ist dieses Ding nicht schwierig. Verwenden Sie es einfach als Datensatz und können Sie bei Bedarf verwendet werden.