笔试题

昨天下午的笔试题。

第一题

问题

说出输出时间,并解释原因。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function wait(){
return new Promise(resolve => {
setTimeout(resolve, 10 * 1000)
})
}

async function main(){
console.time();
let a = wait();
let b = wait();
let c = wait();
await a;
await b;
await c;
console.timeEnd();
}
main();

答案

这题还没想明白

第二题

问题

解析url的参数部分,转成对象形式.重复的以数组形式存储,中文需要转码,没有值得默认值为true。

demo

http://www.domain.com/?user=anonymous&id=123&id=456&city=%E5%8C%97%E4%BA%AC&enabled
转换后

1
2
3
4
5
6
{
user: anonymouse,
id: [123, 456],
city: '北京',
enabled: true
}

答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function parseParam(str) {
let arr = str.split("?");
let queryPart = arr.length > 1 ? arr[1] : [];
if (queryPart.length) {
let obj = {};
let paramsArr = queryPart.split("&"); // ['user=anonymous', 'id=123', ..., 'enabled']
for (let i = 0; i < paramsArr.length; i++) {
let item = paramsArr[i];
let keyValArr = item.split("=");
let key = keyValArr[0];
let value =
keyValArr.length > 1 ? decodeURIComponent(keyValArr[1]) : true;
if (key in obj) {
// 已经有了
if (Array.isArray(obj[key])) {
// 如果是数组形式了
obj[key] = obj[key].push(value);
} else {
obj[key] = [obj[key], value];
}
} else {
obj[key] = value;
}
}
return obj;
} else {
return {}; // 没有参数,返回空对象
}
}

第三题

问题

模板引擎。

demo

1
2
3
4
5
let template = "我是{{name}},年龄{{age}},性别{{sex}}";
let data = {
name: "姓名",
age: 18
};

替换后为:我是姓名,年龄18,性别undefined

答案

1
2
3
4
5
6
7
8
9
10
11
12
13
function render(template, data) {
let key, value, reg;
for (key in data) {
// 遍历对象的属性
value = data[key];
reg = new RegExp("{{" + key + "}}", "g"); // 为对应属性生成相应正则
template = template.replace(reg, value);
}
// 剩余的不在对象中的
let regs = /\{\{\w*\}\}/g;
template = template.replace(regs, "undefined");
return template;
}

第四题

问题

查看短的字符串在长的字符串中出现的位置。类似indexOf,‘34’ ‘1234567’ 返回2,没找到返回-1。

demo

1
'34' '1234567' // 2

答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
function isContain(shortStr, longStr) {
if (typeof shortStr !== "string" && typeof longStr !== "string") {
throw new Error("Please input string");
}
if (shortStr.length > longStr.length) {
return -1;
}
let shortArr = shortStr.split("");
let longArr = longStr.split("");
for (let i = 0; i < longArr.length; i++) {
if (shortArr[0] === longArr[i]) {
for (let j = 1; j < shortArr.length; j++) {
if (shortArr[j] !== longArr[i + j]) {
return -1;
}
if (j === shortArr.length - 1) {
return i;
}
}
}
}
}

第五题

问题

从数组中找出两个数等于目标值,返回下标。leetcode中最简单的那题

demo

1
[2, 7, 11, 15], 9 // [0, 1]

答案

1
2
3
4
5
6
7
8
9
10
11
12
function findTwoNum(nums, target) {
if (!Array.isArray(nums)) {
throw new Error("The first param is not an array");
}
for (let i = 0, len = nums.length; i < len - 1; i++) {
for (let j = i + 1, len = nums.length; j < len; j++) {
if (nums[i] + nums[j] === target) {
return [i, j];
}
}
}
}

答案都是自己当时写的,有不足的后面还要重新优化一下。