185 竞赛
点菜展示表
给你一个数组 orders
,表示客户在餐厅中完成的订单,确切地说, orders[i]=[customerNamei,tableNumberi,foodItemi]
,其中 customerNamei
是客户的姓名,tableNumberi
是客户所在餐桌的桌号,而 foodItemi
是客户点的餐品名称。
请你返回该餐厅的 点菜展示表 。在这张表中,表中第一行为标题,其第一列为餐桌桌号 “Table” ,后面每一列都是按字母顺序排列的餐品名称。接下来每一行中的项则表示每张餐桌订购的相应餐品数量,第一列应当填对应的桌号,后面依次填写下单的餐品数量。
注意:客户姓名不是点菜展示表的一部分。此外,表中的数据行应该按餐桌桌号升序排列。
示例 1:
输入:orders = [["David","3","Ceviche"],["Corina","10","Beef Burrito"],["David","3","Fried Chicken"],["Carla","5","Water"],["Carla","5","Ceviche"],["Rous","3","Ceviche"]] 输出:[["Table","Beef Burrito","Ceviche","Fried Chicken","Water"],["3","0","2","1","0"],["5","0","1","0","1"],["10","1","0","0","0"]] 解释: 点菜展示表如下所示: Table,Beef Burrito,Ceviche,Fried Chicken,Water 3 ,0 ,2 ,1 ,0 5 ,0 ,1 ,0 ,1 10 ,1 ,0 ,0 ,0 对于餐桌 3:David 点了 "Ceviche" 和 "Fried Chicken",而 Rous 点了 "Ceviche" 而餐桌 5:Carla 点了 "Water" 和 "Ceviche" 餐桌 10:Corina 点了 "Beef Burrito"
示例 2:
输入:orders = [["James","12","Fried Chicken"],["Ratesh","12","Fried Chicken"],["Amadeus","12","Fried Chicken"],["Adam","1","Canadian Waffles"],["Brianna","1","Canadian Waffles"]] 输出:[["Table","Canadian Waffles","Fried Chicken"],["1","2","0"],["12","0","3"]] 解释: 对于餐桌 1:Adam 和 Brianna 都点了 "Canadian Waffles" 而餐桌 12:James, Ratesh 和 Amadeus 都点了 "Fried Chicken"
示例 3:
输入:orders = [["Laura","2","Bean Burrito"],["Jhon","2","Beef Burrito"],["Melissa","2","Soda"]] 输出:[["Table","Bean Burrito","Beef Burrito","Soda"],["2","1","1","1"]]
提示:
1 <= orders.length <= 5 * 10^4
orders[i].length == 3
1 <= customerNamei.length, foodItemi.length <= 20
customerNamei
和foodItemi
由大小写英文字母及空格字符' '
组成。tableNumberi
是1
到500
范围内的整数。
/** * @param {string[][]} orders * @return {string[][]} */ // 菜单排序一直不对号,从网上copy了个排序,不对,又把字符串所有的ascii加起来排序,也不对。其实 arr.sort()就对了,sort默认的排序方式为字母排序。它这个排序规则是区分大小写,按照ascii排序。 // 从网上copy的那个排序,它都转换成小写字母了,ascii自然就变了。 // sort 这个方法只有在比较数字的时候能 通过 a-b 升序排列, // sort 字符串比较的时候只能是 if (a > b) return 1; 进行升序排列 // 因为 如果是字符串的话 相减不会自动类型转换 出现 NAN, NAN, NAN ,就返回了原数组。但是可以 做 大于 和 小于 比较。 var displayTable = function(orders) { const mysort = (arr)=>{ // 为什么单纯的sort 就不行 arr.sort(function(s, t) { // let a; // let b; // for(let i=0; i<s.length; i++){ // a+=s[i].charCodeAt() // } // for(let i=0; i<t.length; i++){ // b+=t[i].charCodeAt() // } // 就是因为网上拷贝的这个排序方法,转了一下小写,结果就懵逼了,不知怎么排序。以为这个排序是对的 let a = s.toLowerCase(); let b = t.toLowerCase(); if (a < b) return -1; if (a > b) return 1; return 0; }) return arr; } let map = new Map(); orders.forEach(([name, id, cai])=>{ if(map.has(id)){ map.get(id).push(cai) }else{ map.set(id, []); map.get(id).push(cai); } }) let allcad = []; for(let [key, val] of map){ allcad.push(...val) } // let allcadMap = new Map() // allcad.forEach((a)=>{ // if(!allcadMap.has(a)){ // allcadMap.set(a, 1) // } //}) // allcad = [...allcadMap.keys()]; // 上面不久是像去重吗,直接es6 Set
allcad = [...new Set(allcad)];
allcad = mysort(allcad); // allcad // allcad.sort() let m1 = []; for(let [key, val] of map){ let arr = new Array(allcad.length).fill(0); val.forEach(v=>{ let i = allcad.indexOf(v); arr[i]++; }) let mm = [key, ...arr] mm = mm.map((a, index)=>{ if(index>=1) { return ''+a } else { return a } }) m1.push(mm) } m1.sort((a, b)=>a[0]- b[0]); let newArr = ["Table", ...allcad]; m1.unshift(newArr) return m1 };
/** * @param {string[][]} orders * @return {string[][]} */ var displayTable = function(orders) { let map = {}; orders.forEach(([name, id, cai])=>{ if(map[id]){ map[id].push(cai) }else{ map[id] = []; map[id].push(cai); } }) let allcad = []; Object.values(map).forEach(v=>allcad.push(...v)); allcad = [...new Set(allcad)]; allcad.sort() let m1 = []; for(let [key, val] of Object.entries(map)){ let arr = new Array(allcad.length).fill(0); val.forEach(v=>{ let i = allcad.indexOf(v); arr[i]++; }) let mm = [key, ...arr] mm = mm.map((a, index)=>{ if(index>=1) { return ''+a } else { return a } }) m1.push(mm) } m1.sort((a, b)=>a[0]- b[0]); let newArr = ["Table", ...allcad]; m1.unshift(newArr) return m1 };
数青蛙
给你一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声(字符串 "croak" )的组合。由于同一时间可以有多只青蛙呱呱作响,所以 croakOfFrogs 中会混合多个 “croak” 。请你返回模拟字符串中所有蛙鸣所需不同青蛙的最少数目。
注意:要想发出蛙鸣 "croak",青蛙必须 依序 输出 ‘c’, ’r’, ’o’, ’a’, ’k’ 这 5 个字母。如果没有输出全部五个字母,那么它就不会发出声音。
如果字符串 croakOfFrogs 不是由若干有效的 "croak" 字符混合而成,请返回 -1 。
示例 1:
输入:croakOfFrogs = "croakcroak"
输出:1
解释:一只青蛙 “呱呱” 两次
示例 2:
输入:croakOfFrogs = "crcoakroak"
输出:2
解释:最少需要两只青蛙,“呱呱” 声用黑体标注
第一只青蛙 "crcoakroak"
第二只青蛙 "crcoakroak"
示例 3:
输入:croakOfFrogs = "croakcrook"
输出:-1
解释:给出的字符串不是 "croak" 的有效组合。
示例 4:
输入:croakOfFrogs = "croakcroa"
输出:-1
提示:
1 <= croakOfFrogs.length <= 10^5
字符串中的字符只有 'c', 'r', 'o', 'a' 或者 'k'
// 有效组合的条件为c-->r-->o-->a-->k,否则返回-1
// 必须是这个顺序的,不是这个顺序的,就会出现 r > c || o > r || a > o || k > a 这些情况。
// 所以这道题可以理解为,“字符串是否按某一顺序排列,并且匹配完不会有剩余字符串”
// 以前的思维是用api操作数组,字符串,操作完剩下的结果是否满足条件,后期我发现好多题就有统计某个字符的个数的思路。一个数组里面放好多对于key的个数,有点像那种算法(忘了名字了,就是二进制1位能表示一个特殊函数共8位,然后转10进制)
/** * @param {string} croakOfFrogs * @return {number} */ var minNumberOfFrogs = function(croakOfFrogs) { let c = 0, r = 0, o = 0, a = 0, k = 0, max = 0; let arr = croakOfFrogs.split(''); for(let i=0; i<arr.length; i++){ let x = arr[i]; 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; if(k == 1) { --c; --r; --o; --a; --k; } max = Math.max(max, c); } if(c) return -1 return max };
/** * @param {string} croakOfFrogs * @return {number} */ // 这有问题,思路错的呢,几只青蛙叫是个深刻的问题 var minNumberOfFrogs = function(croakOfFrogs) { let arr = croakOfFrogs.split(''); let count = 0; let str = 'croak'; let index = 0; const checkFrog = (arr)=>{ for(let i=0; i<str.length-1; i++){ if(arr.indexOf(str[i])>=arr.indexOf(str[i+1])){ return false } } return true } let f =0; while(true){ let flag // 如果第一次没顺序,第二次肯定是没顺序的,题目也是说最少 // 这个还是有问题,因为第一次没顺序,第三次也有可能没有,第一次去splice字符可能是第三次,第四次..... // 还有一种情况,第一次无顺序,第二次也没有顺序,但是第三次第一只青蛙可以叫 if(f%2) { flag = true; f++; }else { flag = false; } for(let i=0; i<arr.length; i++){ let c = arr[i]; if(c === str[index]){ index++; arr.splice(i, 1); i--; if(index===5){ index=0; break; } }else{ flag = true; } } if(flag) { count++; f++; }else{ count = Math.max(count, 1) } if(arr.length===0){ return count; } else { if(!checkFrog(arr)){ return -1; } } } return count; };