1418.点菜展示表
链接:1418.点菜展示表
难度:Medium
标签:数组、哈希表、字符串、有序集合、排序
简介:请你返回该餐厅的 点菜展示表 。在这张表中,表中第一行为标题,其第一列为餐桌桌号 “Table” ,后面每一列都是按字母顺序排列的餐品名称。接下来每一行中的项则表示每张餐桌订购的相应餐品数量,第一列应当填对应的桌号,后面依次填写下单的餐品数量。
题解 1 - typescript
- 编辑时间:2021-07-06
- 执行用时:228ms
- 内存消耗:57.3MB
- 编程语言:typescript
- 解法介绍:遍历每张桌子进行排序。
function displayTable(orders: string[][]): string[][] {
const foodSet = new Set<string>();
const tables: Map<number, Map<string, number>> = new Map();
for (const [, table, foodName] of orders) {
const tableNumber = +table;
let map = tables.get(tableNumber);
if (!map) tables.set(tableNumber, (map = new Map()));
map.set(foodName, (map.get(foodName) ?? 0) + 1);
foodSet.add(foodName);
}
const title = [
'Table',
...[...foodSet].sort((s1, s2) => {
const len1 = s1.length;
const len2 = s2.length;
let i = 0;
while (i < Math.min(len1, len2)) {
const code1 = s1.codePointAt(i)!;
const code2 = s2.codePointAt(i)!;
if (code1 !== code2) return code1 - code2;
else i++;
}
if (i === len1) return -1;
else if (i === len2) return 1;
else return 0;
}),
];
const data: number[][] = [];
for (const [table, map] of tables.entries()) {
const item: number[] = [table];
for (let i = 1, l = title.length; i < l; i++) item[i] = map.get(title[i]) ?? 0;
data.push(item);
}
return [title, ...data.sort(([t1], [t2]) => t1 - t2).map(v => v.map(v => v + ''))];
}