網易2018校招前端筆試題解析

前言:注意,網易校招筆試在牛客網進行,在這裏使用js完成算法題時,不要寫一個function() {}就認爲完成了題目,那樣經過率是0%(題主就是這樣,估計筆試掛了。。。)
應該以這種完整的輸入輸出方式完成算法

while(line = readline()) {
    //your function
    print(result)
}

題目1:

小易有一些彩色的磚塊。每種顏色由一個大寫字母表示。各個顏色磚塊看起來都徹底同樣。如今有一個給定的字符串s,s中每一個字符表明小易的某個磚塊的顏色。小易想把他全部的磚塊排成一行。若是最多存在一對不一樣顏色的相鄰磚塊,那麼這行磚塊就很漂亮的。請你幫助小易計算有多少種方式將他全部磚塊排成漂亮的一行。(若是兩種方式所對應的磚塊顏色序列是相同的,那麼認爲這兩種方式是同樣的。)
例如: s = "ABAB",那麼小易有六種排列的結果:
"AABB","ABAB","ABBA","BAAB","BABA","BBAA"
其中只有"AABB"和"BBAA"知足最多隻有一對不一樣顏色的相鄰磚塊。
輸入描述:數組

輸入包括一個字符串s,字符串s的長度length(1 ≤ length ≤ 50),s中的每個字符都爲一個大寫字母(A到Z)。code

輸出描述:對象

輸出一個整數,表示小易能夠有多少種方式。字符串

輸入例子1:it

ABABio

輸出例子1:function

2test

解析:其實這道題思路很簡單,若是字符串包含2種以上不一樣字母,輸出0,正好兩種字母,輸出2,若是隻有一種字母,輸出1。
//代碼僅供參考
while(line = readline()) {
    //切割輸入
    var arr = line.split('');
    //使用對象存儲有多少種字符及其出現次數
    var obj = {};
    var len = arr.length;
    for(var i=0; i<len; i++) {
        if(obj[arr[i]]) {
            obj[arr[i]]++;
        }else {
            obj[arr[i]] = 1;
        }
    }
    //使用Object.keys()方法獲取鍵數組
    var arr2 = Object.keys(obj);
    if (arr2.length > 2) {
        print(0)
    }else if(arr2.length == 2) {
        print(2)
    }else {
        print(1)
    }
}

題目2:

若是一個01串任意兩個相鄰位置的字符都是不同的,咱們就叫這個01串爲交錯01串。例如: "1","10101","0101010"都是交錯01串。
小易如今有一個01串s,小易想找出一個最長的連續子串,而且這個子串是一個交錯01串。小易須要你幫幫忙求出最長的這樣的子串的長度是多少。
輸入描述:循環

輸入包括字符串s,s的長度length(1 ≤ length ≤ 50),字符串中只包含'0'和'1'

輸出描述:

輸出一個整數,表示最長的知足要求的子串長度。

輸入例子1:

111101111

輸出例子1:

3

解析:利用正則/(10)+/g先判斷最長10循環字串,而後判斷該字串先後是否爲0和1。若是不匹配,用/01/g校驗,知足,長度爲2,不然,長度爲1。
while(line = readline()) {
    var patt = /(10)+/g;
    //num爲最大交錯子串長度
    var num = 0;
    //arr爲匹配正則的子串數組
    var arr = line.match(patt);
    //尋找最長10重複子串
    if (arr != null) {
        //maxLen爲10子串長度,maxLenStr爲子串內容
        var maxLen = 0;
        var maxLenStr = '';
        var len = arr.length;
        for(var i=0; i<len; i++) {
            if (arr[i].length > maxLen) {
                maxLen = arr[i].length;
                maxLenStr = arr[i];
            }
        }
        num = maxLen;
        //找到最長10重複子串起始點,判斷其先後是否知足交錯
        var maxLenIndex = line.indexOf(maxLenStr);
        if (line[maxLenIndex-1] == 0) {
            num++;
        }
        if (line[maxLenIndex+maxLen] == 1) {
            num++;
        }
        print(num);
    }else if((/(01)/g).test(line)) {
        print(2);
    }else {
        print(1);
    }
}

題目3:

小易爲了向他的父母表現他已經長大獨立了,他決定搬出去本身居住一段時間。一我的生活增長了許多花費: 小易天天必須吃一個水果而且須要天天支付x元的房屋租金。當前小易手中已經有f個水果和d元錢,小易也能去商店購買一些水果,商店每一個水果售賣p元。小易爲了表現他獨立生活的能力,但願能獨立生活的時間越長越好,小易但願你來幫他計算一下他最多能獨立生活多少天。
輸入描述:

輸入包括一行,四個整數x, f, d, p(1 ≤ x,f,d,p ≤ 2 * 10^9),以空格分割

輸出描述:

輸出一個整數, 表示小易最多能獨立生活多少天。

輸入例子1:

3 5 100 10

輸出例子1:

11

解析:該題也很簡單,其實就是分兩種狀況,一種是須要買水果,另外一種不須要買水果。先判斷假使水果數量充足,只花費房租的問題。

while (line = readline()) {
    //以空格分割輸入
    var arr = line.split(' ');
    //記得對字符串轉數字
    [x,f,d,p] = arr.map(x=>parseInt(x,10));
    //分兩種狀況判斷
    if (Math.floor(d/x) <= f){
        print(Math.floor(d/x));
    }else {
        var day = f;
        d -= f*x;
        day += Math.floor(d/(x+p));
        print(day);
    }
}
相關文章
相關標籤/搜索