Dalam beberapa hari terakhir, saya mencari pekerjaan di cuaca dingin 40 ° di Shanghai. Saya merasa sangat bahagia. Setiap kali saya wawancara, saya harus duduk di sana dan berkeringat untuk waktu yang lama sebelum saya bisa kembali ke akal sehat saya. Saya merasakan cinta dunia yang mendalam untuk saya. Saya kembali ke topik. Selama wawancara, saya menemukan beberapa tes tertulis. Ada satu pertanyaan. Karena saya belum pernah menemuinya dalam pekerjaan saya yang sebenarnya, saya memperhatikannya. Pertanyaannya adalah sebagai berikut:
Ada array: var arr = [1,2,1,3,3,2,4,6,3], yang diubah menjadi distribusi normal dengan memproses: [1,2,3,3,6,4,3,2,1].
Saya akan menjelaskan secara singkat distribusi normal. Bahkan, Anda dapat secara kasar memahami array yang diproses. Kedua ujungnya kecil dan tengahnya besar. Kurva normal yang tercermin dalam sumbu koordinat berbentuk jam, dengan kedua ujungnya rendah dan tengah tinggi. Simetris kiri dan kanan karena kurva berbentuk lonceng, sehingga orang sering menyebutnya kurva berbentuk jam.
Ini adalah pertanyaan terakhir untuk wawancara. Ketika saya mendapatkannya di sini, saya ketat dan cuacanya panas, haus dan lapar. Gadis di meja depan terlihat sangat bagus (berhenti bicara omong kosong, itu karena algoritma itu lemah ...). Setelah sedikit berpikir, saya menulis kode berikut:
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] // Put the subscripts in the front in the order of even numbers} else { temp[l-(i+1)/2] = sortArr[i] // Put the subscripts in the back to front in the order of odd numbers} } console.log(temp) // [1, 2, 3, 3, 6, 4, 3, 2, 1] It looks sempurna}) (arr)Karena itu adalah tes tertulis, saya membuat program dalam pikiran saya untuk sementara waktu dan merasa bahwa tidak ada masalah besar dan menyerahkan kertas. Kemudian, pewawancara melihat makalah tes dan tidak menyebutkan pertanyaan ini selama wawancara. Jadi saya merasa tidak ada masalah dengan metode ini, jadi saya tidak bertanya lagi selama wawancara. Namun, dalam perjalanan kembali, saya tiba -tiba memikirkan situasi seperti ini:
var arr = [1,2,3,4,5,6,7,8,9] // array bertambah reguler ~ (function (arr) {var temp = [], i = 0, l = arr.length, sortarr = arr.sort (function (a, b) {return ab}) untuk (; i <l; i <l; i ++) {ife (i%{i%2 = ... {temp [l- (i+1)/2] = sortarr [i]}} console.log (temp) // [1, 3, 5, 7, 9, 8, 6, 4, 2] Masalahnya telah terjadi.}) (ARR)Ya, dengan cara ini, bagian kiri dan kanan dari array ini tidak simetris, dengan 9 sebagai pusat, dengan 1+3+5+7 = 16 di sebelah kiri, dan 2+4+6+8 = 20 di sebelah kanan. Jelas bahwa kiri ringan dan kanan berat, bukan distribusi normal yang seragam. Seiring tumbuhnya array, masalahnya akan menjadi semakin serius.
Tali garis. . . . Saya seorang kuncup yang akan mekar. Jangan memperlakukan saya seperti ini. . .
Tampaknya kode sebelumnya tidak dapat digunakan, jadi saya hanya dapat memikirkan kembali solusinya. Faktanya, inti dari masalahnya adalah untuk memastikan bahwa sisi kiri dan kanan array sama atau kira -kira sama. Apakah itu array angka ganjil atau bahkan angka, array dapat dibagi menjadi dua bagian (nilai maksimum angka ganjil juga dapat dianggap sebagai array angka genap. Bahkan jika ada beberapa nilai maksimum yang identik, itu tidak masalah. Setelah menyortir dari kecil ke besar, itu hanya perlu menghapus yang terakhir). Atau menurut metode di atas, ketika subskrip rata, letakkan di sisi kiri dan kanan saat aneh, letakkan di sisi kanan. Dalam proses menumbuhkan array di sisi kiri dan kanan, ketika panjang array sama, bandingkan jumlah sisi kiri dan kanan. Karena diatur dari kecil ke besar, dalam keadaan normal, sisi kanan akan lebih besar dari sisi kiri, dan kemudian menukar yang pertama di sebelah kanan dan yang terakhir di sisi kiri untuk mencapai tujuan keseimbangan. Kodenya adalah sebagai berikut:
var arr = [1,2,3,4,5,6,7,8,9], sortarr = arr.sort (function (a, b) {return ab}), l = arr.length, temp_left = [], temp_right = [] sortir (arr) {var i = 0 untuk (; i <l; i ++) {var {var i = 0 untuk (; i <l; i ++) {var {var) {var i = 0 untuk (; i <l; i ++) {var {var i = 0 untuk (; i <l; i ++) {var {var i = 0 untuk (; i <l; i ++) {var {var i = 0 untuk (; i <l; i ++) {var {var i = 0 untuk (; i <l; i ++) {var {var i = 0 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} } } kembalikan temp_left.concat (temp_right)} // array sum function sum (arr) {return eval (arr.join ("+")); } // Array Perbandingan Fungsi Bandingkan (arr1, arr2) {return sum (arr1)> = sum (arr2)} // yang terakhir di pertukaran kiri dengan yang pertama pada bungkus fungsi kanan (l, r) {var m = r.shift () r.unshift (l.pop ()) l.push (m)} console.log. 5, 3, 2]Dengan cara ini, seluruh distribusi normal akan jauh lebih seragam. Lakukan beberapa set tes lagi untuk melihat efeknya:
ARR = [1.333.444.555.66.7788.909] Console.log (Sort (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)) //anjang167.2.174.2.175.5.189.3.177.6.677.168.17.67.187.177.677.577.168.168.187.17.677.677.177.168.17.677.177.177.168.17.67.677.17.67.677.17.67.677.177.177.17.6
Itu terlihat cukup bagus. Ada artikel lain di situs kecil yang diklik untuk dilihat, yang diselesaikan di C ++. Namun, hasil akhir dari artikel itu bukan distribusi normal yang seragam, tetapi mirip dengan program pertama saya.
Saya tidak tahu banyak tentang C ++, dan saya belum menjalankan beberapa set hasil untuk dilihat. Siswa yang tertarik dapat mencobanya sebagai perbandingan.
Saya hanya menguji semua program dalam artikel ini di Chrome. Jika ada masalah dengan browser lain, saya berharap dapat meninggalkan pesan untuk memberi tahu Anda. Bahkan, hal ini tidak sulit. Cukup gunakan itu sebagai catatan dan dapat digunakan saat dibutuhkan.