2022-8-5 笔试练习-晚上场

2351. 第一个出现两次的字母

难度简单

给你一个由小写英文字母组成的字符串 s ,请你找出并返回第一个出现 两次 的字母。

注意:

  • 如果 a 的 第二次 出现比 b 的 第二次 出现在字符串中的位置更靠前,则认为字母 a 在字母 b 之前出现两次。
  • s 包含至少一个出现两次的字母。
复制代码
 1 class Solution {
 2     public char repeatedCharacter(String s) {
 3         Set<Character> set=new HashSet<>();
 4         for (int i=0;i<s.length();i++){
 5             if (set.contains(s.charAt(i))) return s.charAt(i);
 6             else set.add(s.charAt(i));
 7         }
 8         return 'a';
 9     }
10 }
复制代码

思路:第一个集合包含的元素就是答案;

 

2352. 相等行列对

难度中等

给你一个下标从 0 开始、大小为 n x n 的整数矩阵 grid ,返回满足 Ri 行和 Cj 列相等的行列对 (Ri, Cj) 的数目

如果行和列以相同的顺序包含相同的元素(即相等的数组),则认为二者是相等的。

复制代码
 1 class Solution {
 2     public int equalPairs(int[][] grid) {
 3         int n=grid.length;
 4         int[][] arr=new int[n][n];
 5         for (int i=0;i<n;i++){
 6             for (int j=0;j<n;j++){
 7                 arr[i][j]=grid[j][i];
 8             }
 9         }
10         int ans=0;
11         for (int i=0;i<n;i++){
12             for (int j=0;j<n;j++){
13                 if (Arrays.equals(arr[i],grid[j])) ans++;
14             }
15         }
16         return ans;
17     }
18 }
复制代码

思路:把列单独变成数组,然后遍历比较。

 

2353. 设计食物评分系统

难度中等

设计一个支持下述操作的食物评分系统:

  • 修改 系统中列出的某种食物的评分。
  • 返回系统中某一类烹饪方式下评分最高的食物。

实现 FoodRatings 类:

  • FoodRatings(String[] foods, String[] cuisines, int[] ratings) 初始化系统。食物由 foodscuisines 和 ratings 描述,长度均为 n 。
    • foods[i] 是第 i 种食物的名字。
    • cuisines[i] 是第 i 种食物的烹饪方式。
    • ratings[i] 是第 i 种食物的最初评分。
  • void changeRating(String food, int newRating) 修改名字为 food 的食物的评分。
  • String highestRated(String cuisine) 返回指定烹饪方式 cuisine 下评分最高的食物的名字。如果存在并列,返回 字典序较小 的名字。

注意,字符串 x 的字典序比字符串 y 更小的前提是:x 在字典中出现的位置在 y 之前,也就是说,要么 x 是 y 的前缀,或者在满足 x[i] != y[i] 的第一个位置 i 处,x[i] 在字母表中出现的位置在 y[i] 之前。

复制代码
 1 public class FoodRatings {
 2     Map<String,Pair> keyToPair;
 3     Map<String, TreeSet<Pair>> keyToQueue;
 4     public FoodRatings(String[] foods, String[] cuisines, int[] ratings) {
 5         keyToPair=new HashMap<>();
 6         keyToQueue=new HashMap<>();
 7         int n=foods.length;
 8         for (int i=0;i<n;i++){
 9             String key=foods[i];
10             Pair pair=new Pair(foods[i],cuisines[i],ratings[i]);
11             keyToPair.put(key,pair);
12             if (!keyToQueue.containsKey(cuisines[i])){
13                 keyToQueue.put(cuisines[i],new TreeSet<Pair>(new Comparator<Pair>() {
14                     @Override
15                     public int compare(Pair o1, Pair o2) {
16                         if (o1.rate != o2.rate) return Integer.compare(o2.rate, o1.rate);
17                         else return o1.food.compareTo(o2.food);
18                     }
19                 }));
20             }
21             keyToQueue.get(cuisines[i]).add(pair);
22         }
23     }
24 
25     public void changeRating(String food, int newRating) {
26         Pair pair=keyToPair.get(food);
27         keyToQueue.get(pair.cuisine).remove(pair);
28         pair.rate=newRating;
29         keyToPair.put(food,pair);
30         keyToQueue.get(pair.cuisine).add(pair);
31     }
32 
33     public String highestRated(String cuisine) {
34         return keyToQueue.get(cuisine).first().food;
35     }
36 
37     static class Pair{
38         public String food;
39         public String cuisine;
40         public int rate;
41         Pair(String f,String c,int r){
42             food=f;
43             cuisine=c;
44             rate=r;
45         }
46     }
47 }
48 
49 /**
50  * Your FoodRatings object will be instantiated and called as such:
51  * FoodRatings obj = new FoodRatings(foods, cuisines, ratings);
52  * obj.changeRating(food,newRating);
53  * String param_2 = obj.highestRated(cuisine);
54  */
复制代码

思路:两个哈希map分别记录数据以及排序的信息,优先队列性能不如Treeset,能用Treeset优先用Treeset,不用优先队列(能)。

posted on   阿ming  阅读(29)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示