【数字马力校招前端笔试】六道大题,三小时,个人题解

探花考试系统,时间三小时,六道大题,考 js 知识、算法、vue/react 框架用法
难度的话,只要你想到了它要考什么就简单,没想到就无法动笔

  • 题目:给一个字符串,循环输出每一个字符,当输出到最后一个字符时再从头开始
  • 思路:根据打印情况,猜想需要返回一个函数,考点也就在闭包上(当时还思考了迭代器、函数柯里化两个知识点)
function loopString(s) {
  let i = 0
  
  return function () {
    if (i === s.length) i = 0
    let res = s[i]
    i++
    return res
  }
}
const bar = loopString('bar');
console.log(bar(), bar(), bar(), bar()); // 'b' 'a' 'r' 'b'
  • 题目:给一个数,判断该数是否是斐波那契数列里的一项,若是则返回第几项,若不是则返回-1
  • 思路:考算法,递归可能是最先被想到,其实动态规划也简单,我习惯使用,只要维护两个数,两数之和即是下一位数,一直反复推出后面的数字即可
function findFibonacciIndex(n) {
  let a = 1, b = 1, sum = 0, index = 1
  while (sum < n) {
    sum = a + b
    a = b
    b = sum
    index++
  }
  return sum === n ? index : -1
}
console.log(findFibonacciIndex(5)); // 4
  • 题目:实现链式的加减乘除(myCalculator(1).add(12).minus(3).multi(10).div(5).getValue() === 25)
  • 思路:链式,按.调用方法,联想到类的知识点,因为实例调用类中的方法就是按.调用的,调用完后再返回this,也就相当于计算完后,又把实例返回了,可以继续调用方法
function myCalculator(num) {
  // todo
  class Cal {
    constructor(val) {
      this.value = val
    }
    getValue() {
      return this.value
    }
    // 加法
    add(newVal) {
      this.value = this.value + newVal
      return this
    }
    // 减法
    minus(newVal) {
      this.value = this.value - newVal
      return this
    }
    // 乘法
    multi(newVal) {
      this.value = this.value * newVal
      return this
    }
    // 除法
    div(newVal) {
      this.value = this.value / newVal
      return this
    }
  }
  const obj = new Cal(num)
  return obj
}
console.log(myCalculator(121).add(1).minus(2)); // 120
  • 题目:搜索多个文件夹路径(字符串数组,例如['/usr/bin', '/etc/config']),查找是否有公共路径,若有则返回公共路径(字符串),否则返回 null
  • 思路:类似于搜索字符串的公共前缀,那么双循环就可以搞定,但是得对数组处理一下,因为路径里包含了 ‘/’ 需要除去,所以返回答案时还要还原回来
function findParentDirectory(paths) {
  // write your code here ...
  let arr = []
  // 把 paths 处理为二维数组赋值给 arr
  paths.forEach(ele => {
    let a = ele.split('/')
    a.shift()
    arr.push(a)
  });
  let res = []
  for (let i = 0; i < arr[0].length; i++) {
    let isTrue = true
    for (let j = 0; j < arr.length - 1; j++) {
      if (arr[j][i] !== arr[j + 1][i]) {
        isTrue = false
        break
      }
    }
    isTrue && res.push(arr[0][i])
  }
  if (res.length) {
    return '/' + res.join('/')
  } else {
    return null
  }
}
console.log(findParentDirectory(['/home/usr/vue', '/home/usr/react']));
// '/home/usr'
  • 题目:若a * a + b * b === c * c,则称'a,b,c'为勾股数,找出比 n 小的所有勾股数
  • 思路:三循环暴力求解,暂时没想到更好的方法,先感谢各位观众给出更好的方法了(评论区已有大佬给出一种双指针的解法了)
function gougu(n) {
  let arr = []
  // 最小的勾股数从 3 开始
  for (let a = 3; a <= n; a++) {
    for (let b = a + 1; b <= n; b++) {
      for (let c = b + 1; c <= n; c++) {
        if (a * a + b * b === c * c) {
          arr.push(`${a},${b},${c}`)
        }
      }
    }
  }
  return arr
}
console.log(gougu(10)); // 
  • 题目:用 vue、react 分别实现同一个功能,框架实战,用定时器可以搞定,异步请求我直接用的 Promise 对象, 不确定是否正确

如果觉得对你有帮助的话,点个赞呗~

反正发文又不赚钱,交个朋友呗~

如需转载,请注明出处foolBirdd

你可能感兴趣的:(面试,算法,javascript,vue.js,递归法)