java数青蛙_『字节跳动LeetCode联合周赛』--周赛185(JavaScript) | OFEII

前言

😆Hi! my name is OFEII, a Front-end Developer rookie......

😅Still 0 offer in this cold 2020 Spring.

😀菜鸟。大四前端菜鸟,20春招至今还是0 offer(下周好像有两个hr面了),兴趣使然地刷上了LeetCode,发现用js刷算法是一件很有趣的事,感受到数据结构和算法的魅力所在。我爱js,我爱算法,我爱前端。

😅好笑。本周的LeetCode周赛185是『字节LeetCode联合周赛』,本想着刷到前300拿个字节跳动的内推面试,却发现被各路算法dalao吊打,奈何自己太菜,规定时间内差不多才做了两道,现在想想真是有够好笑!

🙂苦练。虽然我起步晚,但这几个月来一直在复习前端知识,查漏补缺,恶补数据结构和算法,计算机网络,刷题,刷leetcode,写题解,写总结。苦练屠龙技,加油!看了很多掘金上的文章,衷心地感谢掘金这个平台!

😛初露。比赛后,把今天的周赛的题又研究一下,并写了题解总结,发布了我在掘金上的第一篇文章。我的目标是写一本《前端js算法-面试笔试速成大法》!虽然感觉很遥远。第一次写文章,有不足之处请各位dalao多多指点。

🙏许愿。最后许愿上海众安保险的offer。

leetcode周赛185-1:💾reformat重新格式化

题目

给你一个混合了数字和字母的字符串 s,其中的字母均为小写英文字母。

请你将该字符串重新格式化,使得任意两个相邻字符的类型都不同。也就是说,字母后面应该跟着数字,而数字后面应该跟着字母。

请你返回 重新格式化后 的字符串;如果无法按要求重新格式化,则返回一个 空字符串 。

具体题目及示例🌰

解题思路💡

一、拼接法💾

建立两个数组a1,a2分别存储数字和字母,res存储结果

遍历一次,用Number.isFinite() 将数字和字母分类(正则也ok)

拼接字符串数组:① len2(字母) > len1(数字) 字母在前 ② 反之,数字在前

判断返回空字符的情况:① len1,len2均小于0 ② len1,len2之间的差值大于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 

Number.isFinite(nArr[i]) ? a1.push(nArr[i]) : a2.push(arr[i])

}

let l1 =a1.length,l2 =a2.length

for (let i = 0; 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('')

};

复制代码

leetcode周赛185-2:🍣displayTable点菜展示表

题目

给你一个数组 orders,表示客户在餐厅中完成的订单,确切地说, orders[i]=[customerNamei,tableNumberi,foodItemi] ,其中 customerNamei 是客户的姓名,tableNumberi 是客户所在餐桌的桌号,而 foodItemi 是客户点的餐品名称。

请你返回该餐厅的 点菜展示表 。在这张表中,表中第一行为标题,其第一列为餐桌桌号 “Table” ,后面每一列都是按字母顺序排列的餐品名称。接下来每一行中的项则表示每张餐桌订购的相应餐品数量,第一列应当填对应的桌号,后面依次填写下单的餐品数量。

注意:客户姓名不是点菜展示表的一部分。此外,表中的数据行应该按餐桌桌号升序排列。

具体题目及示例🌰

解题思路💡

一、hash法🍣

建立一个table(map)存储每桌的菜品数量,一个foods(set)存储菜单上菜品(食物)的种类,res存储结果

遍历一遍orders订单数组--->常规操作--->得到

table: 每一桌的桌号(key) ---> [每一桌上菜品的种类(key) ---> 及对应数量(value)] (value) 本质上就是map嵌套map

foods: 去重的菜品的种类

res传入标题 'Table'+ 排序后的foods (用扩展运算符...将set转化为数组)

遍历table的每一桌,菜品存在,传入数量,否则传入0,注意到转化为str。

每次遍历,将每一桌的桌号和下单的餐品数量依次传入一个数组temp,再传给res。

按餐桌桌号升序排列 sort(a,b)=>a[0]-b[0] (Unicode编码上,数字比一切字母都小,可以直接忽略res[0]标题)

代码📃

// 一、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])

};

复制代码

leetcode周赛185-3:🐸minNumberOfFrogs数青蛙

题目

给你一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声(字符串 "croak" )的组合。由于同一时间可以有多只青蛙呱呱作响,所以 croakOfFrogs 中会混合多个 “croak” 。请你返回模拟字符串中所有蛙鸣所需不同青蛙的最少数目。

注意:要想发出蛙鸣 "croak",青蛙必须 依序 输出 ‘c’, ’r’, ’o’, ’a’, ’k’ 这 5 个字母。如果没有输出全部五个字母,那么它就不会发出声音。

如果字符串 croakOfFrogs 不是由若干有效的 "croak" 字符混合而成,请返回 -1 。

具体题目及示例🌰

解题思路💡

一、计数法🐸

遍历字符串,计数c r o a k ,若存在其他字符返回-1

有效组合的条件为c-->r-->o-->a-->k,否则返回-1

所有蛙鸣所需不同青蛙的最少数目cnt --->最多同时存在多少个c---> cnt = Math.max(cnt, c)

判断k的值,若k==1,某只青蛙的蛙鸣声结束,c r o a k 均减1

遍历结束后,若有多余的c r o a k 返回-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

};

复制代码

leetcode周赛185-4:🍨numOfArrays生成数组

题目

给你三个整数 n、m 和 k 。下图描述的算法用于找出正整数数组中最大的元素。

1d73c043f130d9891527cf8fccdb20d6.pngimg

请你生成一个具有下述属性的数组 arr :

arr 中有 n 个整数。

1 <= arr[i] <= m 其中 (0 <= i < n) 。

将上面提到的算法应用于 arr ,search_cost 的值等于 k 。

返回上述条件下生成数组 arr 的 方法数 ,由于答案可能会很大,所以 必须 对 10^9 + 7 取余

具体题目及示例🌰

解题思路💡

一、三维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)

代码📃

// 一、三维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 

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 排版

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值