笔试题集

笔试场上,刀刀致命

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'
}

解答:
借助evalmatchAll,借助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.1. 红灯亮20秒,并且最后5秒闪烁
    1.2. 绿灯亮20秒,并且最后5秒闪烁
    1.3. 黄灯亮10秒
    1.4. 次序为 红-绿-黄-红-绿-黄
  2. 灯的个数、颜色、持续时间、闪烁时间、灯光次序都可配置,如:
    lights=[{color: '#fff', duration: 10000, twinkleDuration: 5000}, ... ]
    */
posted @ 2020-01-06 22:42  饭特稠  阅读(406)  评论(1编辑  收藏  举报