笔试题集
笔试场上,刀刀致命
1
//1. 给定一个模板和一个对象,利用对象中的数据渲染模板,并返回最终结果。
let template = '你好,我们公司是{{ company }},我们属于{{group.name}}业务线,我们在招聘各种方向的人才,包括{{group.jobs[0]}}、{{group["jobs"][1]}}等。'
function render (template, obj) {}
let obj = {
group: {
name: 'MI',
jobs: ['前端']
},
company: 'BAT'
}
解答:
借助eval
和matchAll
,借助eval动态执行代码,借助matchAll匹配:
function render (template, obj) {
// 代码实现
const re = /\{\{\s*(.+?)\s*\}\}/g
let results = template.matchAll(re)
for (let match of results) {
with (obj) {
template = template.replace(match[0], eval(match[1]))
}
}
return template
}
或者借助Function
构造函数动态执行代码:
function render (template, obj) {
// 代码实现
const re = /\{\{\s*(.+?)\s*\}\}/g
return template.replace(re, function(match, $1) {
let val = (new Function(`return this.${$1}`)).call(obj)
return val
})
}
2
// 2. 完成 convert(list) 函数,实现将 list 转为 tree
/**
* @param list {object[]},
* @param parentKey {string}
* @param currentKey {string}
* @param rootValue {any}
* @return object
*/
convert(list, 'parentId', 'id', 0)
const list = [
{
'id': 19,
'parentId': 0
},
{
'id': 18,
'parentId': 16
},
{
'id': 17,
'parentId': 16
},
{
'id': 16,
'parentId': 0
}
]
解答:
function convert(list, parentKey, currentKey, rootValue) {
const tree = {[currentKey]: rootValue}
// 获取某一父节点的子节点
function getChildren(leaf, pid) {
let len = list.length
for (let i = 0; i < len; i++) {
let item = list[i]
if (!item) continue
if (item[parentKey] === pid) {
if (leaf.children) {
leaf.children.push(item)
} else {
leaf.children = [item]
}
list[i] = null
}
}
if (list.some(item => item) && leaf.children) {
for (let child of leaf.children) {
getChildren(child, child.id)
}
}
return leaf
}
return getChildren(tree, rootValue)
}
思路:先写一个通用的获取子节点的函数,然后递归调用。缺点,有副作用,会改变传入的list参数。
3
对数字的“重量”排序。如 ‘15’的重量是1+5=6
。重量相同时,按字典序排序。
'15 1 9 26' => '1 15 26 9'
素数之积
判断一个数是不是可以拆开成两个素数的积
一辆车载重量一定,如何让车装的快递最多
不同于动态规划,这道题要挑重量小的装,才能装的最多。
信号灯
/** 1. 信号灯控制器
用 React 实现一个信号灯(交通灯)控制器,要求:
- 默认情况下,
1.1. 红灯亮20秒,并且最后5秒闪烁
1.2. 绿灯亮20秒,并且最后5秒闪烁
1.3. 黄灯亮10秒
1.4. 次序为 红-绿-黄-红-绿-黄 - 灯的个数、颜色、持续时间、闪烁时间、灯光次序都可配置,如:
lights=[{color: '#fff', duration: 10000, twinkleDuration: 5000}, ... ]
*/
cnblogs-md-editor编辑器,用Markdown写博客就用它