😆Hi! my name is OFEII, a Front-end Developer rookie......前端
😅Still 0 offer in this cold 2020 Spring.c++
😀菜鸟。大四前端菜鸟,20春招至今仍是0 offer(下周好像有两个hr面了),兴趣使然地刷上了LeetCode,发现用js刷算法是一件颇有趣的事,感觉到数据结构和算法的魅力所在。我爱js,我爱算法,我爱前端。web
😅可笑。本周的LeetCode周赛185是『字节LeetCode联合周赛』,本想着刷到前300拿个字节跳动的内推面试,却发现被各路算法dalao吊打,奈何本身太菜,规定时间内差很少才作了两道,如今想一想真是有够可笑!面试
🙂苦练。虽然我起步晚,但这几个月来一直在复习前端知识,查漏补缺,恶补数据结构和算法,计算机网络,刷题,刷leetcode,写题解,写总结。苦练屠龙技,加油!看了不少掘金上的文章,衷心地感谢掘金这个平台!算法
😛初露。比赛后,把今天的周赛的题又研究一下,并写了题解总结,发布了我在掘金上的第一篇文章。个人目标是写一本《前端js算法-面试笔试速成大法》!虽然感受很遥远。第一次写文章,有不足之处请各位dalao多多指点。数组
🙏许愿。最后许愿上海众安保险的offer。网络
给你一个混合了数字和字母的字符串 s,其中的字母均为小写英文字母。数据结构
请你将该字符串从新格式化,使得任意两个相邻字符的类型都不一样。也就是说,字母后面应该跟着数字,而数字后面应该跟着字母。ssh
请你返回 从新格式化后 的字符串;若是没法按要求从新格式化,则返回一个 空字符串 。数据结构和算法
1、拼接法💾
//1、拼接法
let reformat = (s)=> {
let arr = s.split(''), n = arr.length
let nArr = arr.map(e=>+e)
let a1 = [], a2 =[], res=[]
for(let i = 0; i < n; i++){
Number.isFinite(nArr[i]) ? a1.push(nArr[i]) : a2.push(arr[i])
}
let l1 =a1.length,l2 =a2.length
for (let i = 0; i < n; i++) {
l2 > l1 ? res.push(a2[i],a1[i]) : res.push(a1[i],a2[i])
}
return ((l1 <=0 && l2<=0 ) || Math.abs(l1-l2)>1)? "" : res.slice(0, n).join('')
};
复制代码
给你一个数组 orders,表示客户在餐厅中完成的订单,确切地说, orders[i]=[customerNamei,tableNumberi,foodItemi] ,其中 customerNamei 是客户的姓名,tableNumberi 是客户所在餐桌的桌号,而 foodItemi 是客户点的餐品名称。
请你返回该餐厅的 点菜展现表 。在这张表中,表中第一行为标题,其第一列为餐桌桌号 “Table” ,后面每一列都是按字母顺序排列的餐品名称。接下来每一行中的项则表示每张餐桌订购的相应餐品数量,第一列应当填对应的桌号,后面依次填写下单的餐品数量。
注意:客户姓名不是点菜展现表的一部分。此外,表中的数据行应该按餐桌桌号升序排列。
1、hash法🍣
// 1、hash法
let displayTable = (orders) => {
let table = new Map(), foods = new Set(), res = []
for(let [a, b, c] of orders){ //a:name b:table c: food ordered
foods.add(c)
if(table.has(b)){
let map = table.get(b)
table.set(b, map.set(c, map.has(c) ? map.get(c)+1 : 1))
}else{
let map = new Map()
table.set(b, map.set(c, 1))
}
}
let menu = [...foods].sort()
res.push(['Table',...menu])
for(let [t, o] of table){ // t:tableId o: all ordered food in tableId
let temp = []
for(let n of menu){
temp.push(o.has(n) ? '' + o.get(n) : '0')
}
res.push([t,...temp])
}
return res.sort((a,b)=>a[0]-b[0])
};
复制代码
给你一个字符串 croakOfFrogs,它表示不一样青蛙发出的蛙鸣声(字符串 "croak" )的组合。因为同一时间能够有多只青蛙呱呱做响,因此 croakOfFrogs 中会混合多个 “croak” 。请你返回模拟字符串中全部蛙鸣所需不一样青蛙的最少数目。
注意:要想发出蛙鸣 "croak",青蛙必须 依序 输出 ‘c’, ’r’, ’o’, ’a’, ’k’ 这 5 个字母。若是没有输出所有五个字母,那么它就不会发出声音。
若是字符串 croakOfFrogs 不是由若干有效的 "croak" 字符混合而成,请返回 -1 。
1、计数法🐸
//1、计数法
let minNumberOfFrogs = (croakOfFrogs)=> {
let c=0, r=0, o=0, a=0, k=0, cnt=0
for(let x of croakOfFrogs){
if(x=='c') c++
else if(x=='r') r++
else if(x == 'o') o ++
else if(x == 'a') a ++
else if(x == 'k') k ++
else return -1
if(r>c || o>r || a>o || k>a) return -1
cnt = Math.max(c, cnt)
if(k==1){
c--
r--
o--
a--
k--
}
}
return (c || r || o || a || k)? -1 : cnt
};
复制代码
给你三个整数 n、m 和 k 。下图描述的算法用于找出正整数数组中最大的元素。
请你生成一个具备下述属性的数组 arr :
返回上述条件下生成数组 arr 的 方法数 ,因为答案可能会很大,因此 必须 对 10^9 + 7 取余
1、三维dp🍨
dp状态定义:dp[i][j][k]表示前i个元素,最大值为j,同时search_cost为k的方案数。
dp转移方程:对于 1<= x <= m+1,存在两种不一样的状况:
j < x <= m 时, dp[i + 1][x][k + 1] += dp[i][j][k]
1 <= x <= j 时, dp[i + 1][j][k] += dp[i][j][k]
(每次dp后应该对1e9+7 取余)
空间复杂度:三维dp O(nmk)
时间复杂度:O(nmkm)
// 1、三维dp
let numOfArrays = (n, m, k)=> {
let dp = new Array(n+1).fill(0).map(()=>new Array(m+1).fill(0).map(()=>new Array(k+1).fill(0)))
let mod = 1e9+7, res = 0
dp[0][0][0] = 1
for(let i = 0; i < n; i++)
for(let j = 0; j <= m; j++)
for(let k = 0; k <= i; k++)
for(let x = 1; x <= m; x++){
if(x > j){
dp[i + 1][x][k + 1] += dp[i][j][k]
dp[i + 1][x][k + 1] %= mod
}
else {
dp[i + 1][j][k] += dp[i][j][k]
dp[i + 1][j][k] %= mod
}
}
for(let i=1; i<=m; i++){
res += dp[n][i][k]
res %= mod
}
return res
};
复制代码
本文使用 mdnice 排版