7月算法训练------第二十二天(有序集合)解题报告
题目类型:有序集合
题目难度:困难
第一题、1418. 点菜展示表
- 题目链接:1418. 点菜展示表
- 思路分析:
运用哈希表;
哈希表 nameSet 保存所有的餐品名称;
哈希表 foodsCnt 保存桌号及该桌点餐数量,点餐数量也用一个哈希表保存。
遍历订单并保存信息后,从nameSet 中提取餐品名称,并按字母顺序排列;从foodsCnt 中提取桌号,并按桌号升序排列。然后将餐品名称和桌号分别填入点菜展示表的第一行和第一列。对于表中的餐品数量,我们逐行填入,对于每一行,我们遍历餐品名称,在foodsCnt 中查找对应的点餐数量,然后填入表格中对应位置。
从订单中获取餐品名称和桌号,统计每桌点餐数量
提取餐品名称,并按字母顺序排列
提取桌号,并按餐桌桌号升序排列
填写点菜展示表
需要注意的Collections.sort(names);
4. 代码:
class Solution {
public List<List<String>> displayTable(List<List<String>> orders) {
Set<String> nameSet = new HashSet<String>();
Map<Integer, Map<String, Integer>> foodCnt = new HashMap<Integer, Map<String, Integer>>();
for(List<String> order : orders){
nameSet.add(order.get(2));
int id = Integer.parseInt(order.get(1)); // 将字符串转换为整数
Map<String, Integer> map = foodCnt.getOrDefault(id, new HashMap<String, Integer>());
map.put(order.get(2), map.getOrDefault(order.get(2), 0) + 1);
foodCnt.put(id, map);
}
int n = nameSet.size();
List<String> names = new ArrayList<String>();
for(String name : nameSet){
names.add(name);
}
Collections.sort(names);
int m = foodCnt.size();
List<Integer> ids = new ArrayList<Integer>();
for(int id : foodCnt.keySet()){
ids.add(id);
}
Collections.sort(ids);
List<List<String>> table = new ArrayList<List<String>>();
List<String> header = new ArrayList<String>();
header.add("Table");
for(String name : names){
header.add(name);
}
table.add(header);
for(int i = 0; i < m; ++i){
int id = ids.get(i);
Map<String, Integer> cnt = foodCnt.get(id);
List<String> row = new ArrayList<String>();
row.add(Integer.toString(id));
for(int j = 0; j < n; ++j){
row.add(Integer.toString(cnt.getOrDefault(names.get(j), 0)));
}
table.add(row);
}
return table;
}
}
剑指offer
第二题、剑指 Offer 05. 替换空格
- 题目链接:剑指 Offer 05. 替换空格
- 思路分析:
将字符串转换为字符数组,然后遍历数组,如果是' '
,则将其替换为"%20"
。 - 代码:
class Solution {
public String replaceSpace(String s) {
StringBuilder sb = new StringBuilder();
char[] c = s.toCharArray();
for(char cc : c){
if(cc == ' '){
sb.append('%');
sb.append('2');
sb.append('0');
}else{
sb.append(cc);
}
}
return sb.toString();
}
}
第三题、剑指 Offer 58 - II. 左旋转字符串
- 题目链接:剑指 Offer 58 - II. 左旋转字符串
- 思路分析:
将字符串转变为字符数组,然后从第n位开始遍历这个数组,将第n位以后的字符都加入到StringBuilder中,然后再将前n位加入到StringBuilder中。 - 代码:
class Solution {
public String reverseLeftWords(String s, int n) {
StringBuilder sb = new StringBuilder();
char[] ch = s.toCharArray();
for(int i = n; i < ch.length; i++){
sb.append(ch[i]);
}
for(int i = 0; i < n; i++){
sb.append(ch[i]);
}
return sb.toString();
}
}