寄一次失败的笔试
前天蔚来突然给我发了邮件让我参加他的笔试,看了一圈没看见HR联系方式和申请推迟的连接,算了硬着头皮上吧,算法这两天临时补一补吧
结果他考了50分选择,剩下50分才是算法
选择题
选择题涉及到1/3数据结构、算法和设计模式,还有2/3是前端三件套
......
寄!
前面三分之一我没太系统的学过,剩下三分之二没有好好复习...
得,算法题我复习了,以前也系统的复习过一边,应该不会丢太多分吧
算法题
第一题:求n的阶乘中含有‘0’的个数
这题简单,根本没有算法可说
// 懒得写了省略吧
第二题:在一个字符串中切除一部分,使得剩下的部分是回文,求这个回文的最大长度
只能切除连续的一段,例如‘abbcfa’中切除从第四个到第五个字符,剩下‘abba’是回文,最大长度4
因为截掉的字符串只有两种情况:
- 是原字符串中间的一部分
- 是原字符串左边或者右边的一部分
我的解法是,先把左右两边对称的部分排除,这一部分一定是回文串的一部分,长度记为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模式,太紧张了,遇到了不会的东西之后就自乱阵脚,会写的算法也写不出来了,要调整心态。
小马要加油!