本のjs面接試験問題


すべての起源
  • まず、リンク先のリンク
  • それから、テーマです.
  • です.
    javscript関数fnを作成します.この関数は、ランダムで反復しないn個の整数であり、整数の取得範囲は[2,32]であるパラメータn(デジタルタイプ)があります.
  • 最後に、まず自分で書きます.問題をよく読んで、問題をよく調べてください.
  • 私の最初のコード
        let fn = function (n) {
            if ( n < 0) {
                return null;
            } else {
                let num = [];
                let i;
                for(i = 0; i < n; i++) {
                    num[i] =(Math.random() * 31 ) + 2;
                }
                return num;
            }
        };
    もちろん不合格ですよ!!
    問題の再審&題意分析
  • によってもたらされるfnのパラメータnは、正の整数でなければならない.すなわち、他のタイプの値ではなく、numberタイプでなければならない.ゼロより大きい.小数点を持たない値
  • .
  • 出力タイプは配列であり、ランダムであり、重複できない
  • です.
    じゃ、私の問題は強調されました.じゃ、修正してください.
        let fn = function(n) {
            /*
             *      ,     
             */
            if (n < 0 || typeof n !== 'number' || n % 1 !== 0) {
                return null;
            } else {
                let num = [];
                let i;
                let j;
                let tmp;
                let flag = 0;
                 /*
                  *      ,           
                  *        'i = i - flag + 1'   :
                  *     flag 1                 ,
                  *     i      ,       ,          
                  */
                for (i = 0; i < n; i = i - flag + 1) {
                    flag = 0;
                    tmp = Math.floor((Math.random() * 31) + 2);
                    if (i !== 0) {
                        for (j = 0; j <= i; j++) {
                            if (num[j] === tmp) {
                                flag = 1;
                                break;
                            }
                        }
                    }
                    if (flag === 0)
                        num[i] = tmp;
                }
                return num;
            }
        };
    焼き戻し
    タイトルを見ても、今は自慢話ではないと分かりました.また原文を見て、いくつかの問題があります.
  • は入力されたn値を検査していません.重複がないとnの値は最大値、つまり乱数が発生する範囲の差を
  • と加算しなければなりません.
  • 論理とデータの分離ができていません.つまり、乱数の範囲を変更する必要があるなら、このコードは多くのところで修正が必要です.これは小さな関数です.巨大なプロジェクトなら、結果は想像に耐えません.
  • 詳しい注釈が不足しています.これは他の人の読解に役立ちません.
  • はもともと存在していたデータ構造を利用できません.例えば、jsを過ぎるとsetというデータ構造があります.その中に入れた値は重複できません.そうすると、人工的な判断の面倒を回避して、もっと優雅になります.
        /**
         *   :           ,   [2, 32]
         *
         * @param : [number] n         
         * @return: [array]    n       ,  n  ,        
         */
    
        let fn = function (n) {
            //  n  ,     
            if (n < 0 || typeof n !== 'number' || n % 1 !== 0) {
                return [];
            } else {
    
                //          
                let minRange = 2;
                let maxRange = 32;
    
                //      Set     
                let num = new Set();
                let length = maxRange - minRange + 1;
                //n  ,     
                if( n > length) {
                    return [];
                }
                while(num.size < n) {
                    //         Set  
                    num.add(Math.floor((Math.random() * length) + minRange));
                }
                // Set  Array
                return Array.from(num);
              }
        };
    使用済みの知識
  • typeof判定データタイプ
  • 補足:データタイプ:undefined、object(Nullを含む)、bollan、number、string、smbol、function
  • Math.randowm().ランダム発生[0,1]間の乱数
  • Math.flor().下に整えて、つまり1.7=>1、-2.3=>-3
  • 補足:Math.ceeir()上向きに整理する
  • 補足:Math.round()四捨五入
  • Set()は、重複していないデータを記憶するために使用される
  • .
    反省する
  • 私のjsの良いごみの
  • コードを書く前に、詳細な需要分析を行う必要があります.
  • 入力値に対して、十分に細かいと判断する必要があります.
  • 論理とデータ分離が重要です.
  • 詳細な注釈を書く必要があります.
  • できるだけ既存のツールを使って、車輪を繰り返さないでください.やむを得ない限り、