天天搞业务,真是发现一到面试算法环节就容易脑子先嗡嗡空白一下,然后再告诉自己冷静冷静,不慌,可以的可以的……
好了,进入正题,今儿小米一面一道题目如下。
比如有以下数组,同一个用户按照数组顺序,从u1->u2, u2->u3 等路径,统计出出现次数最多的路径。(只考虑一步即可,一开始没理解题目,还考虑了u1->u2->u3,费了不少时间)
const arr = [
{user: 'A', url: 'u1'},
{user: 'B', url: 'u1'},
{user: 'C', url: 'u1'},
{user: 'A', url: 'u2'},
{user: 'B', url: 'u2'},
{user: 'A', url: 'u3'},
{user: 'C', url: 'u3'},
{user: 'A', url: 'u4'},
]
// A: 'u1->u2' 'u2->u3' 'u3->u4'
// B: 'u1->u2'
// C: 'u1->u3'
// 统计出现次数最多的 eg:'u1->u2' 2次
面试的时候,我用了两次遍历,然后面试官说一次也可以。然后面试结束后花了半个小时实现了一下…
function findMaximum(arr) {
const curUserUrl = {}
const pathObj = {}
let maxCount = 0
let path = ''
arr.forEach(e => {
if (curUserUrl[e.user]) {
let curPath = `${curUserUrl[e.user]}->${e.url}`
if (pathObj[curPath]) {
pathObj[curPath] += 1;
if (pathObj[curPath] > maxCount) {
maxCount = pathObj[curPath]
path = curPath
}
} else {
pathObj[curPath] = 1
}
}
curUserUrl[e.user] = e.url
});
return {
path,
maxCount
}
}
啊~~自己都写了半个小时,真到面试时候,时间怎么够┐(T.T ) ( T.T) ノ
最近还是多练习练习,虽然讨厌面试算法,但是为了💰💰💰,冲吧~~~