最近、私は上海の40°の涼しい気候での仕事を探しています。とても幸せです。私がインタビューするたびに、私は自分の感覚に戻ることができる前に、そこに座って長い間汗をかかなければなりません。私は私にとって世界の深い愛を感じています。トピックに戻りました。インタビュー中に、いくつかの筆記試験に遭遇しました。質問が1つあります。私は実際の仕事でそれに遭遇したことがないので、私はそれに注意を払います。質問は次のとおりです。
配列があります:var arr = [1,2,1,3,3,2,4,6,3]。これは、処理によって正規分布に変更されます:[1,2,3,6,4,3,2,1]。
正規分布について簡単に説明します。実際、処理された配列を大まかに理解できます。両端は小さく、中央は大きいです。座標軸に反映される通常の曲線は時計型であり、両端は低く、中程度です。曲線がベル型であるため、左右の対称性があるため、人々はしばしば時計型の曲線と呼びます。
これはインタビューの最後の質問です。ここでそれを手に入れたとき、私はきつく、天気は暑く、のどが渇いていて、空腹でした。フロントデスクの少女はとても良く見えました(ナンセンスを話すのをやめてください、それはアルゴリズムが弱かったからです...)。少し考えた後、私は次のコードを書きました:
var arr = [1,2,1,3,3,3,2,4,6,3]〜(function(arr){var temp = []、i = 0、l = arr.length、sortarr = arr.sort(function(a、b){return ab})//最初にアレイを小さくて大幅に配置して[1、3、3、3、3、3、4、6] if(i%2 == 0){temp [i/2] = sortarr [i] //サブスクリプトを正面に偶数程度に置きます} else {temp [l-(i+1)/2] = sortarr [i] // sumpscriptsを前面に向けて奇数数の順に置きます}} console.log(temp)パーフェクト})(arr)それは筆記試験だったので、私はしばらくの間、私の心の中でプログラムをYYEDでYYEREDで、大きな問題はないと感じ、紙を引き渡しました。その後、インタビュアーはテストペーパーを見て、インタビュー中にこの質問について言及しませんでした。だから私はこの方法に問題がないと感じたので、インタビュー中に二度と尋ねなかった。しかし、帰り道、私は突然このような状況を考えました:
var arr = [1,2,3,4,5,6,7,8,9] //通常の増分配列〜(function(arr){var temp = []、i = 0、l = arr.length、sortarr = arr.sort(a、b){return ab}) {temp [l-(i+1)/2] = sortarr [i]}} console.log(temp)// [1、3、5、7、9、8、6、4、2]問題が発生しました。はい、このようにして、この配列の左と右の部分は対称ではなく、9は中心として、左は1+3+5+7 = 16、右側は2+4+6+8 = 20です。左が軽く、右が重く、均一な正規分布ではないことは明らかです。アレイが成長するにつれて、問題はますます深刻になります。
ラインストラップ。 。 。 。私は咲きそうなつぼみです。私をこのように扱わないでください。 。 。
以前のコードは使用できないようですので、ソリューションのみを再考することができます。実際、問題の中核は、配列の左側と右側が等しいか、ほぼ等しいことを確認することです。奇数数の配列であろうと偶数の数字であろうと、配列は2つの部分に分割できます(奇数数の最大値は偶数配列と見なすこともできます。複数の同一の最大値がある場合でも、それは重要ではありません。または、上記の方法に従って、下付き文字が均等になる場合、奇妙なときに左側と右側に置いて、右側に置きます。左側と右側に配列を拡大する過程で、配列の長さが等しい場合、左側と右側の合計を比較します。通常の状況下では小さいから大部分から大きく配置されているため、右側は左側よりも大きくなり、右側の最初の側と左側の最後のものを交換してバランスの目的を達成します。コードは次のとおりです。
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 = [] function sort(arr){arr){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)// temp_left.concat(temp_right)} // array sum function sum(arr){return eval(arr.join( "+")); } // array比較関数比較(arr1、arr2){return sum(arr1)> = sum(arr2)} //右の交換の最後の1つは、右の関数ラップ(l、r){var m = r.shift()r.unshift(l.pop())l.push(m)} console.log(arrg(arr) / 8、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、4、6 5、3、2]これにより、正規分布全体がはるかに均一になります。効果を確認するために、さらにいくつかのテストを行います。
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))// [167.2,174.2,175.5,5,189.3,177.6,177.5,168.6,167.8]
かなり良さそうです。小さなサイトには、C ++で完了した表示にクリックした別の記事があります。ただし、記事の最終結果は均一な正規分布ではありませんでしたが、最初のプログラムに似ていました。
C ++についてはあまり知りませんし、結果を見るために複数のセットを実行していません。興味のある学生は比較としてそれを試すことができます。
Chromeのこの記事のすべてのプログラムのみをテストしました。他のブラウザに問題がある場合は、メッセージを残してお知らせします。実際、このことは難しくありません。レコードとして使用するだけで、必要に応じて使用できます。