寄一次失败的笔试(蔚来前端笔经)

204 阅读3分钟

寄一次失败的笔试

前天蔚来突然给我发了邮件让我参加他的笔试,看了一圈没看见HR联系方式和申请推迟的连接,算了硬着头皮上吧,算法这两天临时补一补吧

结果他考了50分选择,剩下50分才是算法

选择题

选择题涉及到1/3数据结构、算法和设计模式,还有2/3是前端三件套

......

寄!

前面三分之一我没太系统的学过,剩下三分之二没有好好复习...

得,算法题我复习了,以前也系统的复习过一边,应该不会丢太多分吧

算法题

第一题:求n的阶乘中含有‘0’的个数

这题简单,根本没有算法可说

// 懒得写了省略吧

第二题:在一个字符串中切除一部分,使得剩下的部分是回文,求这个回文的最大长度

只能切除连续的一段,例如‘abbcfa’中切除从第四个到第五个字符,剩下‘abba’是回文,最大长度4

因为截掉的字符串只有两种情况:

  1. 是原字符串中间的一部分
  2. 是原字符串左边或者右边的一部分

我的解法是,先把左右两边对称的部分排除,这一部分一定是回文串的一部分,长度记为res1,然后剩下的没排除的部分就一定是第二种情况了,这时候只要依次遍历每个分割点,找到最大长度的回文res2,res1与res2的和就是答案

 var fn = function(str) {
    function check(startIndex, endIndex) {
      for (let i = startIndex, j = endIndex; i < j; i++, j--) {
        if (str[i]!==str[j]) return false
      }
      return true
    }
    let res1 = 0
    let res2 = 0
    let left = 0, right = str.length-1
    for (; left < right; left++, right--) {
      if (str[left]!==str[right]) break
      res1 += 2
    }
    for (let i = left; i < right; i++) {
      if (check(left, i)) {
        res2 = res2 > i - left + 1 ? res2 : i - left + 1
      }
      if (check(i + 1, right)) {
        res2 = res2 > right - i ? res2 : right - i
      }
    }
    return res1+res2
  };

第三题:求通过所有的关卡花费的最小时间

一个迷宫有许多道关卡,每道关卡上有两个带有不同序号 i 的门,破解门所需要的的时间为 cost[i] 和走过的上一道门所消耗时间的乘积,但是如果这个关卡选择的门和上个关卡选择的门相同,则不需要花费时间。第一道关卡所花费的时间为cost[i]

标准的动态规划,而且为了让你动态规划,把题目出的一点也不真实 —— 凭啥走过这一道门花费的时间还要乘上上一道门花费的时间呀?这不符合常识吧,分明就是为了满足‘后一个状态由前一个状态推出’这个条件嘛

得,那就顺出题者的意吧,动态规划

第一步:确定dp数组每一项代表的含义:dp[i] [j]表示在第i关,想要打开第j(只有两个,0和1)个门所花费的最少的时间

第二步:确定递推公式:有点麻烦,放在下面代码区

第三步:初始化dp数组,dp[0]的二维数组题目已经给出了——第一道关卡所花费的时间为cost[i]

第四步:确定遍历顺序:当然是依次遍历每一个关卡啦

var fn = function(doors, cost) {
  const dp = new Array(doors.length).fill(0).map(()=>new Array(2).fill(-1))
  dp[0]=[cost[doors[0][0]], cost[doors[0][1]]]
  function getMin(preIndex, cur) {
      const [door1, door2] = doors[preIndex]
      const [cost1, cost2] = dp[preIndex]
      return Math.min((cur===door1 ? 0 : (cost[door1] * cost[cur])) + cost1, (cur===door2 ? 0 : (cost[door2] * cost[cur])) + cost2)
  }
  for (let i = 1; i < doors.length; i++) {
      dp[i][0]=getMin(i-1, doors[i][0])
      dp[i][1]=getMin(i-1, doors[i][1])
  }
  return dp
};
const doors = [[1,3],[2,5],[5,3],[3,1],[2,3]]
const cost = [0, 5, 1, 3, 1, 2]
console.log(fn(doors, cost))

......

寄!

前面写的太慢,自乱阵脚了,结果就写出来前两道,第二道还就通过了70%

总结

HTML5(考的少)和CSS3(考的多)该系统复习一下了,尤其是那些选择器什么的

数据结构和、常用的排序算法的特点、设计模式、算法效率之类是我这个非科班的短板,该抽时间学一学了

第一次笔试,还是用以前没用过的ACM模式,太紧张了,遇到了不会的东西之后就自乱阵脚,会写的算法也写不出来了,要调整心态。

小马要加油!