位元組跳動2019第三次筆試(JavaScript版本)
阿新 • • 發佈:2019-02-01
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);
}
}