做过的题再遇到还是想不起来,还是勤劳一点,多做笔记把
- 重新格式化字符串
比赛时候完全用字符串拼接,写了很长时间。赛后看大佬们讨论,才想到用栈保存
这个就是先把数字保存一个栈,然后字母保存一个栈,然后看他么的差是否大于1.之后一人一下的往里面放。
class Solution {
public String reformat(String s) {
Stack<Character> stack1 = new Stack();
Stack<Character> stack2 = new Stack();
String str="";
for(char c : s.toCharArray()){
if(c >= '0' && c <= '9')stack1.add(c);
else stack2.add(c);
}
if (Math.abs(stack1.size() - stack2.size()) > 1) return str;
Stack<Character> temp = new Stack();
if (stack2.size()> stack1.size()) {
temp = stack2;
stack2 = stack1;
stack1 = temp;
}
while(!stack1.empty() || !stack2.empty()){
str+=String.valueOf(stack1.size()>stack2.size()?stack1.pop():stack2.pop());
}
return str;
}
}
- 点菜展示表
平时刷题很少用到TreeMap,赛后学习到了。
class Solution {
public List<List<String>> displayTable(List<List<String>> orders) {
// 菜单foodSet
TreeSet<String> foodSet = new TreeSet<>();
// 订单集合 <餐桌号,<食品名称,食品数量>>
TreeMap<String, TreeMap<String, Integer>> orderMap = new TreeMap<>(Comparator.comparingInt(Integer::parseInt));
//1 遍历订单,填入相关信息
for (List orderList : orders) {
//1.1 获得餐桌号
String tableNumber = (String) orderList.get(1);
//1.2 获得食品名称
String foodName = (String) orderList.get(2);
//1.3 食品set里面加入食品名称
foodSet.add(foodName);
//1.4.1 如果不存在xx桌的订单,就创建一条订单map
if (!orderMap.containsKey(tableNumber)) {
// xx食品map
TreeMap<String, Integer> food = new TreeMap<>();
food.put(foodName, 1);
// 将xx桌订单添加到所有订单map中
orderMap.put(tableNumber, food);
} else {
// 1.4.2 如果xx桌子订单存在
TreeMap<String, Integer> foodMap = orderMap.get(tableNumber);
// 如果xx桌子订单中不存在xx事物,就加入
if (!foodMap.containsKey(foodName)) {
// 将食物map添加到已存在的桌子订单中
foodMap.put(foodName, 1);
} else {
// 如果已经存在xx事物,就将数量加1
foodMap.put(foodName, foodMap.get(foodName) + 1);
}
}
}
//2、将订单map写到结果集中
List<List<String>> result = new ArrayList<>();
// 2.1 添加第一行标题、
ArrayList<String> title = new ArrayList<>();
title.add("Table");
for (String s : foodSet) {
title.add(s);
}
result.add(title);
//2.2 遍历订单map,将信息写到结果结合
Set<String> tables = orderMap.keySet();
for (String tableN : tables) {
// 根据桌号获取 食品清单
Map foods = orderMap.get(tableN);
// 创建一条xx桌订单list
ArrayList<String> list = new ArrayList<>();
// 加入桌号
list.add(tableN);
// 遍历foodSet,根据foodSet中的食物名称来查foods,存在就返回数量。不存在就返回0
for (String name : foodSet) {
// 如果存在xx事物
if (foods.containsKey(name)) {
String foodNum = String.valueOf(foods.get(name));
list.add(foodNum);
} else {
// 如果没有预定xx事务,就将订单上写0
list.add("0");
}
}
result.add(list);
}
return result;
}
}
这道题是真的麻烦,所以引用题解区一位大佬详细的注释题解。
- 数青蛙
思路。
统计青蛙叫的过程,这里可以只统计c或者统计所有字母。
出现一次c就累加一次,遇到k就减一次
然后取其中出现最大的第二个问题
就是如何判断有效性,
首先 上来可以判断下是否是5的倍数,
其次 后面出现字母的次数一定小于前面出现
比如 croaak 在遇到第二个a的时候,o才只有一个 a却能出现两个,所以就可以直接返回-1。
class Solution {
public int minNumberOfFrogs(String croakOfFrogs) {
char[] chars = croakOfFrogs.toCharArray();
if (chars.length % 5 != 0) {
return -1;
}
Map<Character, Integer> map = new HashMap<>();
map.put('c', 0);
map.put('r', 1);
map.put('o', 2);
map.put('a', 3);
map.put('k', 4);
int[] counts = new int[5];
int result = 0;
for (char c : chars) {
int idx = map.get(c);
++counts[idx];
result = Math.max(result, counts[idx]);
if(idx>0 && counts[idx-1] < counts[idx])
return -1;
if (idx == 4) {
for (int i = 0; i < 5; ++i) {
--counts[i];
}
}
}
return result;
}
}
- 生成数组
太难了 题解也看不懂。我先学习学习