1. 程式人生 > >位元組跳動2019第三次筆試(JavaScript版本)

位元組跳動2019第三次筆試(JavaScript版本)

UTF-8校驗

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

//js版本程式碼
/**
 * Created by dcp on 2018/9/9.
 */
// UTF-8校驗
const readline = require('readline');
const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout
});
var inputArr = [];
rl.on('line', function (input) {
    inputArr.push(input);

    var nLine = +inputArr[0
];//轉化成數字型別 // console.log(inputArr) if (inputArr.length==2) { // console.log(inputArr) // console.log(inputArr.slice(1)) var arr=inputArr.slice(1).toString().split(' ') var result=arr.map(function (item) { return item-0 }) // console.log(arr)
// console.log(result) console.log(validUtf8(result)) } }); function validUtf8(data) { if(data==null || data.length==0) return 0; for(var i=0;i<data.length;i++) { if(data[i]>255) return 0; // 1 after 8th digit, 100000000 var numberOfBytes = 0; if((data[i] & 128
) == 0) { // 0xxxxxxx, 1 byte, 128(10000000) numberOfBytes = 1; } else if((data[i] & 224) == 192) { // 110xxxxx, 2 bytes, 224(11100000), 192(11000000) numberOfBytes = 2; } else if((data[i] & 240) == 224) { // 1110xxxx, 3 bytes, 240(11110000), 224(11100000) numberOfBytes = 3; } else if((data[i] & 248) == 240) { // 11110xxx, 4 bytes, 248(11111000), 240(11110000) numberOfBytes = 4; } else { return 0; } for(var j=1;j<numberOfBytes;j++) { // check that the next n bytes start with 10xxxxxx if(i+j>=data.length) return 0; if((data[i+j] & 192) != 128) return 0; // 192(11000000), 128(10000000) } i=i+numberOfBytes-1; } return 1; }

2. IP地址還原

這裡寫圖片描述


/**
 * Created by dcp on 2018/9/9.
 */
var readline=require("readline");
var r1=readline.createInterface({
    input:process.stdin,
    output:process.stdout
});

//陣列儲存輸入
// var inputs=[];
r1.on("line",function(data){
    // inputs.push(data);

    console.log(restoreIpAddresses(data))


});
var restoreIpAddresses = function(s) {
    var length = s.length;
    var result = [];
    parse([], 0);
    return result.length;
    function parse(prefix, idx) {
        if (prefix.length === 4) {
            return idx === length ? result.push(prefix.join('.')) : null;
        }
        for (var i = 1; i <= 3; i++) {
            var token = s.substring(idx, idx + i);
            if (/^(0|[^0]\d*)$/.test(token) && parseInt(token) < 256) {
                var newPrefix = prefix.slice(0);
                newPrefix.push(token);
                parse(newPrefix, idx + i);
            }
        }
    }
};

最長不重複子串

查詢 最大 不含重複字元 子字串
思路:視窗遍歷

/**
 * Created by dcp on 2018/9/9.
 */


// 最大不重複子串
var readline=require("readline");
var r1=readline.createInterface({
    input:process.stdin,
    output:process.stdout
});

//陣列儲存輸入
// var inputs=[];
r1.on("line",function(data){
    // inputs.push(data);

    console.log(lengthOfLongestSubstring(data))


});
var lengthOfLongestSubstring = function(s) {
    let [mx, start, chars] = [0, 0, {}];
    for (let i = 0; i < s.length; i++){
        if (start <= chars[s[i]]){
            start = chars[s[i]] + 1;
        } else{
            mx = Math.max(mx, i - start + 1);
        }
        chars[s[i]] = i;
    }
    return mx;
};

抖音網紅

反向建立有向圖,逐個dfs,dfs返回路徑等於人數,則計數加一

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述



var Graph = (function () {



function Graph(v) {



this.vertices = v;



this.edges = 0;



this.adj = [];



this.marked = [];



for (var i = 0; i < this.vertices; i++) {



this.adj[i] = [];



this.marked[i] = false;



}



}



Graph.prototype.addEdge = function (v, w) {



this.adj[v].push(w);



this.edges += 1;



}



// search



function _dfs(v, path) {



this.marked[v] = true;



if (this.adj[v] != undefined) {



path.push(v);



}



this.adj[v].forEach(element => {



if (!this.marked[element]) {



_dfs.call(this, element, path);



}



});



}



Graph.prototype.dfs = function (v) {



for (var i = 0; i < this.vertices; i++) {



this.marked[i] = false;



}



var path = [];



_dfs.call(this, v, path);



return path;



}



return Graph;



})();



// 讀取資料



var readline = require('readline');



const rl = readline.createInterface({



input: process.stdin,



output: process.stdout,



terminal: false



});



var N, M;



var curLine = 0;



var g;



rl.on('line', function (line) {



if (curLine === 0) {



N = parseInt(line.trim());



g = new Graph(N + 1);



} else if (curLine === 1) {



M = parseInt(line.trim());



}else if(curLine === 2){



var arr = line.trim().split(' ');



for (var i = 0; i < M * 2; i+=2) {



arr[i] = parseInt(arr[i]);



arr[i + 1] = parseInt(arr[i + 1]);



g.addEdge(arr[i + 1], arr[i]);



}



var cnt = 0;



for (var i = 1; i <= N; i++) {



var tmp = g.dfs(i);



if(tmp.length === N){



cnt++;



}



}



console.log(cnt);



rl.close();



}



curLine++;



});

.分幾個部門

這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述
這裡寫圖片描述

題目描述:
本公司有很多團隊,現在要將關係緊密的團隊放到同一個部門。給定一個M*M的二維陣列,如:
4
0 1 1 0
1 0 0 0
1 0 0 1
0 0 1 1
其中4表示二維陣列的大小,1代表一個團隊,上下或左右相連的1(團隊)表示其關係緊密,求最後分出的部門數。
輸入描述:
第一行第一個整數表示M(M<1000),
後面每一行表示團隊之間的關係分佈,如上所示的數陣
輸出描述:
一個整數
示例:
輸入:
4
0 1 1 0
1 0 0 0
1 0 0 1
0 0 1 1
輸出:
3


  var readline = require('readline');



        const rl = readline.createInterface({



        input: process.stdin,



        output: process.stdout,



        terminal: false



        });



        var M = 0;



        var curLine = 0;



        var input = [];



        rl.on('line', function (line) { // javascript每行資料的回撥介面



        if(curLine === 0){



        M = parseInt(line.trim());



        }else{



        input.push(line.trim().split(' '));



        if(curLine === M){



        console.log(func(input));;



        rl.close();



        }



        }



        curLine++;



        });



        function func(input){



        var cnt = 0;



        for(var i = 0; i < input.length; i++){



        for(var j = 0; j < input[0].length; j++){



        if(input[i][j] == 1){



        visit(input, i, j);



        cnt++;



        }



        }



        }



        return cnt;



        }






// 遞迴遍歷上下左右節點,訪問後直接置零

        function visit(input, i, j){



        input[i][j] = 0;



        if(i-1 >= 0 && input[i-1][j] == 1){



        visit(input, i-1, j);



        }



        if(i+1 < input.length && input[i+1][j] == 1){



        visit(input, i+1, j);



        }



        if(j-1 >= 0 && input[i][j-1] == 1){



        visit(input, i, j-1);



        }



        if(j+1 < input[0].length && input[i][j+1] == 1){



        visit(input, i, j+1);



        }



        }