JavaScript編程題(含騰訊2016校招題)


傳說中的Coding

作者:ManfredHu
鏈接:http://www.manfredhu.com/2016/04/02/15-veryGoodForUsing/
聲明:版權所有,轉載請保留本段信息,否則請不要轉載

幾道覺得挺有意思的編程題,感覺做下來,自己對一些新方法的看法有了新的變化。
比如indexOf,reduce,Array.isArray,forEach這些方法,以前一看到兼容性是IE9+就有點害怕,項目中不敢用,導致后面越來越陌生,不過現在一想的話。其實只要用Polyfill或者提前fix掉就可以了。^_^
而且隨着瀏覽器的更新迭代,這些方法肯定會獲得更多的支持。

ps:希望新手更要多用這些方法,在特別是學日常學習訓練的時候

更新:參加騰訊筆試的編程題,覺得挺有意思的,補上,不過可惜選擇語言的時候沒有JavaScript。郁悶了好久-_-!!

1. 用reduce統計一個數組中單詞出現的次數

var arr = ["apple","orange","apple","orange","pear","orange"];

function getWordCnt(){
    //以下應掏空
    return arr.reduce(function(prev,next,index,arr){
        prev[next] = (prev[next] + 1) || 1; //這句是重點,剛開始都是undefined的時候undefined+1會是NaN
        return prev;
    },{});
}

console.log(getWordCnt());

注意:這里傳入了{}作為初始參數,所以第一個prev會是一個空對象,所以第一次的prev[next]會是undefined,而這里用了賦值

2.給定字符串 str,檢查其是否包含連續重復的字母(a-zA-Z),包含返回 true,否則返回 false

function containsRepeatingLetter(str) {
    //以下應掏空
    return /([a-zA-Z])\1/.test(str); // \1指代第一個括號的匹配項
}

在正則表達式中,利用()進行分組,使用斜杠加數字表示引用,\1就是引用第一個分組,\2就是引用第二個分組。將[a-zA-Z]做為一個分組,然后引用,就可以判斷是否有連續重復的字母。

3.已知fn為一個預定義函數,實現函數curryIt

需要補全的代碼

var fn = function(a, b, c) {
    return a + b + c
};
curryIt(fn)(1)(2)(3); //6

function curryIt(fn) {
    //這里補充
}

可以試着玩一下,這里是用的函數的柯里化

var fn = function(a, b, c) {
    return a + b + c
};
console.log(curryIt(fn)(1)(2)(3)); //6

function curryIt(fn) {
    //以下應掏空
    if(typeof fn !== 'function') throw new Error("curryIt():fn must be function");
    var len = fn.length; //獲取函數形參數量
    var slice = Array.prototype.slice;
    var arg = slice.call(arguments, 1);
    return function() {
        arg = arg.concat(slice.call(arguments));
        if(arg.length < len) { //當等於函數需要的形參數量時候調用
            return arguments.callee;
        }else{
            return fn.apply(null,arg);
        }
    }
}

4. 蛇形矩陣(2016騰訊校招編程題)

作為一種常用的數學數列,是由1開始的自然數一次排列成的一個N*N的正方形矩陣,數字一次由外而內的遞增,如下面實例:

n=3的蛇形矩陣
1 2 3
8 9 4
7 6 5

n=6的蛇形矩陣
 1  2  3  4  5  6
20 21 22 23 24  7
19 32 33 34 25  8
18 31 36 35 26  9
17 30 29 28 27 10
16 15 14 13 12 11

此題要求輸入蛇形矩陣寬度N,輸出整個蛇形矩陣結果,注意輸出格式要求按照矩陣從上至下的依次按行輸出,每行中間無需換行輸出。

樣本輸入: 3
樣本輸出: 1 2 3 8 9 4 7 6 5

自己寫的答案(歡迎補充)^_^

//可以把代碼復制到Chrome控制台運行
;
(function() {
    function fixIsArray() {
        if (!Array.isArray) {
            Array.isArray = function(arr) {
                return Object.prototype.toString.call(arr).slice(8, -1) === "Array";
            }
        }
    }
    fixIsArray(); //fix Array.isArray(Array.isArray在IE9+支持)

    function Arr2D(d) {
        if (typeof d !== 'number') throw new Error('Arr2D():arguments d must be number');
        this.d = d;
        this.arr = this.init2DArr(d);
    }

    Arr2D.prototype.reat2DArr = function() {
        var c = 0, //環數
            i = 0, //行
            j = 0, //列
            out = 1, //總數
            z,
            n = this.d,
            a = this.arr;

        //檢驗參數
        if (!Array.isArray(a)) throw new Error('reat2DArr():arguments a must be Array');
        if (typeof n !== 'number') throw new Error('reat2DArr():arguments n must be Number');

        z = n * n;

        while (out <= z) {
            i = 0; /*每輪后初始化下i,j*/
            j = 0;
            for (i += c, j += c; j < n - c; j++) {
                if (out > z) break;
                a[i][j] = out++;
            }
            for (j--, i = i + 1; i < n - c; i++) {
                if (out > z) break;
                a[i][j] = out++;
            }
            for (i--, j = j - 1; j >= c; j--) {
                if (out > z) break;
                a[i][j] = out++;
            }
            for (j++, i = i - 1; i > c; i--) {
                if (out > z) break;
                a[i][j] = out++;
            }
            c++;
        }

        return this;
    };

    Arr2D.prototype.printArr = function() {
        var a = this.arr,
            n = this.d,
            lineStr;
        if (!Array.isArray(a)) throw new Error('printArr():arguments a must be Array');
        for (i = 0; i < n; i++) {
            lineStr = "";
            for (j = 0; j < n; j++) {
                lineStr += ' ' + a[i][j];
            }
            console.log(lineStr);
        }

        return this;
    };

    //初始化二維矩形數組
    Arr2D.prototype.init2DArr = function(m) {
        var arr = [],
            i, j;
        for (i = 0; i < m; i++) {
            arr[i] = [];
            for (j = 0; j < m; j++) {
                arr[i][j] = 0;
            }
        }
        return arr;
    };

    //調用函數,測試數據數據為3
    var arr = new Arr2D(3);
    arr.reat2DArr().printArr();

})();

5. 大招來了:特別的回文字符串(2016騰訊校招編程題)

所謂回文字符串,就是一個字符串,從左到右和從右到左讀是完全一樣的。比如”aba”、”c”。
對於一個字符串,可以通過刪除某些字符而變成回文字符串,如”cabebaf”,刪除’c’,’e’,’f’后
剩下子串’abba’就是回文字符串。
要求,給定任意一個字符串,字符串最大長度1000,計算出最長的回文字符串長度。
如’cabebaf’的回文字符串包括’c’,’aba’,’abba’等,最長回文”abba”長度為4。
輸入:字符串
輸出:最大的回文字符串長度。
示例:
輸入:cabbeaf
輸出:4

問題:個人是覺得上面這道題的描述是有問題的,比如cabebaf,那么abeba算不算回文?通常應該是算的。但是按照題目的意思則是abba才算回文,abeba是不算的。

而且這里有干擾項,輸入示例的cabbeaf中,要刪除字符e才能檢測出回文abba。所以這跟普通的回文判斷完全不一樣。

普通的估計用這樣的方法就能判斷了

//判斷如abba,abeba這樣的字符串
function testArr(str) {
    //將字符串切割為字符數組,倒序反轉再判斷跟原來的字符串是否一樣
    return str.split('').reverse().join('') === str;
}

但是這里不是普通的題目,所以剛開始我想的是用indexOflastIndexOf來做,通過字符串的逐漸縮小范圍,indexOflastIndexOf又可以避免要刪除字符e的尷尬。

;
(function() {
    //輸入:cabbeaf
    //4
    String.prototype.roundWord = function() {
        var i = 0,
            str = this,
            count = 0, //回文計數
            left, right = str.length - 1,
            max = 0,
            flag = false;

        if (str.length <= 0) throw new Error("roundWord(): arguments str/this must be string");

        while (i < str.length) {
            charOne = str.charAt(i);
            left = str.indexOf(charOne, i);

            if (!flag) {
                right = str.lastIndexOf(charOne);
            } else {
                right = str.lastIndexOf(charOne, right);
            }

            if (left !== right && left < right) { //頭尾有相同字符
                if (++count >= max) max = count;
                flag = true; //開始有回文
            }
            i++;

        }
        return count*2;
    };

    var str = "cababeacf123";
    console.log(str.roundWord()); //6
    str = "cabbeaf";
    console.log(str.roundWord()); //4

})();


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM