2020.0319美团笔试-前端(node.js)+讨论求解
😢感觉赛马🐴网的 OJ 对前端js太不友好了吧,5道题4道超时,js在OJ上本来速度就不如其他语言。
🧐淦!突然发现了赛🐴网的OJ注意事项:Web编程题:javascript不支持ES6及以上。不支持ES6,哦那没事了😁。
😊推荐大家去看一下leetcode300最长上升子序列-今晚两道题和 LIS有关。
一、扎银花-签到题(秒A)
AC-100%
数组从大到小排序,取前三之和,比较大小😃
const readline = require('readline') const rl = readline.createInterface({ input: process.stdin, ouput: process.stdout }) let inArr = [] rl.on('line', line=>{ if(!line) return inArr.push(line.trim()) if(inArr.length === 3){ let n = +inArr[0] let arr1 = inArr[1].split(' ').map(e=>+e) let arr2 = inArr[2].split(' ').map(e=>+e) let max1 = getMax(arr1) let max2 = getMax(arr2) let max = (max1 == max2) ? max1: Math.max(max1, max2) console.log(max) } }) function getMax(arr) { let res = arr.sort((a,b)=>b-a) let max = res[0]+res[1]+res[2] return max }
二、最长上升子序列-删除一个数
超时-18%
dp/贪心 + 二分查找,写了两种,试了两种,杠了至少半个小时🥺
两种都超时,时间复杂度dp是O(n^2),贪心 + 二分查找是O(nlogn)
const readline = require('readline') const rl = readline.createInterface({ input: process.stdin, ouput: process.stdout }) let inArr = [] rl.on('line', line=>{ if(!line) return inArr.push(line.trim()) if(inArr.length === 2){ let n = +inArr[0] let arr = inArr[1].split(' ').map(e=>+e) let tmp = [] let res = [] for (let i = 0; i < n; i++) { tmp = [...arr].del(i) res.push(lengthOfLIS(tmp)) } let max = Math.max(...res) console.log(max) } }) var lengthOfLIS = function(nums) { const len = nums.length if (len == 0) return 0 if (len == 1) return 1 let dp = new Array(len).fill(1) for (let i = 1; i < len; i++) { for (let j = 0; j < i; j++) { dp[i] = Math.max(dp[i], nums[i] > nums[j] ? dp[j] + 1 : 1) } } return Math.max(...dp) }; Array.prototype.del=function(n) { if(n<0) return this else return this.slice(0,n).concat(this.slice(n+1,this.length)) }
三、任务-dp
超时-18%
本来感觉比较简单能拿分的,最后十分钟才开始做,没做完😂
四、跑步-bfs
超时-18%
自闭了😶
五、最长上升子序列-翻转查询
超时-64%
这道题感觉思路,算法都没问题。用贪心 + 二分查找比dp的ac率还低。😶
const readline = require('readline') const rl = readline.createInterface({ input: process.stdin, ouput: process.stdout }) let inArr = [] let n rl.on('line',line=>{ if(!line) return inArr.push(line.trim()) n = inArr[0].split(' ').map(e=>+e)[1] if(inArr.length === n+2){ let arr = inArr[1].split('').map(e=>+e) let qc = [] for (let i = 0; i < n; i++) { qc[i] = inArr[i+2].split(' ') if(qc[i][0]=='c'){ let [c,a,b]=qc[i] for (let i = a-1; i < b; i++) { if(arr[i]==0){ arr[i]=1 }else { arr[i]=0 } } } if(qc[i][0]=='q'){ console.log(lengthOfLIS(arr)) } } } }) var lengthOfLIS = function(nums) { const len = nums.length if (len == 0) return 0 if (len == 1) return 1 let dp = new Array(len).fill(1) for (let i = 1; i < len; i++) { for (let j = 0; j < i; j++) { dp[i] = Math.max(dp[i], nums[i] >= nums[j] ? dp[j] + 1 : 1) } } return Math.max(...dp) };
总结
今晚的题总体难度比上一次的低,但我还是太菜了😢理想是4A,现实只有2A。
希望能进面试了吧🤦♂️
在OJ上,赛🐴网不行❌,牛客网可以✅。
有大佬讲解一下3、4的思路吗?
#美团笔试##笔试题目##前端##美团#