LeetCode第189场周赛

LeetCode第189场周赛—刷就完事了~

5412. 在既定时间做作业的学生人数

给你两个整数数组 startTime(开始时间)和 endTime(结束时间),并指定一个整数 queryTime 作为查询时间。

已知,第 i 名学生在 startTime[i] 时开始写作业并于 endTime[i] 时完成作业。

请返回在查询时间 queryTime 时正在做作业的学生人数。形式上,返回能够使 queryTime 处于区间 [startTime[i], endTime[i]](含)的学生人数。

示例 1:

输入:startTime = [1,2,3], endTime = [3,2,7], queryTime = 4
输出:1
解释:一共有 3 名学生。
第一名学生在时间 1 开始写作业,并于时间 3 完成作业,在时间 4 没有处于做作业的状态。
第二名学生在时间 2 开始写作业,并于时间 2 完成作业,在时间 4 没有处于做作业的状态。
第二名学生在时间 3 开始写作业,预计于时间 7 完成作业,这是是唯一一名在时间 4 时正在做作业的学生。

public int busyStudent(int[] startTime, int[] endTime, int queryTime) {
  int count = 0;
    for(int i=0;i<startTime.length;i++){
        if(queryTime>=startTime[i] && queryTime <= endTime[i])
            count++;
    }
    return count;
}

5413. 重新排列句子中的单词

「句子」是一个用空格分隔单词的字符串。给你一个满足下述格式的句子 text :

  • 句子的首字母大写
  • text 中的每个单词都用单个空格分隔。

请你重新排列 text 中的单词,使所有单词按其长度的升序排列。如果两个单词的长度相同,则保留其在原句子中的相对顺序。

请同样按上述格式返回新的句子。

示例 1:

输入:text = "Leetcode is cool"
输出:"Is cool leetcode"
解释:句子中共有 3 个单词,长度为 8 的 "Leetcode" ,长度为 2 的 "is" 以及长度为 4 的 "cool" 。
输出需要按单词的长度升序排列,新句子中的第一个单词首字母需要大写。

示例 2:

输入:text = "Keep calm and code on"
输出:"On and keep calm code"
解释:输出的排序情况如下:
"On" 2 个字母。
"and" 3 个字母。
"keep" 4 个字母,因为存在长度相同的其他单词,所以它们之间需要保留在原句子中的相对顺序。
"calm" 4 个字母。
"code" 4 个字母。
public String arrangeWords(String text) {
     String[] splits = text.split(" ");

     splits[0] = String.valueOf(Character.toLowerCase(splits[0].charAt(0)))+splits[0].substring(1);

     Arrays.sort(splits, new Comparator<String>() {
         @Override
         public int compare(String s1, String s2) {
             if(s1.length() > s2.length())
                 return 1;
             else if(s1.length() == s2.length())
                 return 0;
             else
                 return -1;
         }
     });
     splits[0] = String.valueOf(Character.toUpperCase(splits[0].charAt(0)))+splits[0].substring(1);
     StringBuilder sb = new StringBuilder();
     for(String s:splits){
         sb.append(" "+s);
     }
     return sb.toString().trim();
 }

5414. 收藏清单

给你一个数组 favoriteCompanies ,其中 favoriteCompanies[i] 是第 i 名用户收藏的公司清单(下标从 0 开始)。

请找出不是其他任何人收藏的公司清单的子集的收藏清单,并返回该清单下标*。下标需要按升序排列。*

示例 1:

输入:favoriteCompanies = [["leetcode","google","facebook"],["google","microsoft"],["google","facebook"],["google"],["amazon"]]
输出:[0,1,4] 
解释:
favoriteCompanies[2]=["google","facebook"] 是 favoriteCompanies[0]=["leetcode","google","facebook"] 的子集。
favoriteCompanies[3]=["google"] 是 favoriteCompanies[0]=["leetcode","google","facebook"] 和 favoriteCompanies[1]=["google","microsoft"] 的子集。
其余的收藏清单均不是其他任何人收藏的公司清单的子集,因此,答案为 [0,1,4] 。

示例 2:

输入:favoriteCompanies = [["leetcode","google","facebook"],["leetcode","amazon"],["facebook","google"]]
输出:[0,1] 
解释:favoriteCompanies[2]=["facebook","google"] 是 favoriteCompanies[0]=["leetcode","google","facebook"] 的子集,因此,答案为 [0,1] 。

示例 3:

输入:favoriteCompanies = [["leetcode"],["google"],["facebook"],["amazon"]]
输出:[0,1,2,3]

提示:

  • 1 <= favoriteCompanies.length <= 100
  • 1 <= favoriteCompanies[i].length <= 500
  • 1 <= favoriteCompanies[i][j].length <= 20
  • favoriteCompanies[i] 中的所有字符串 各不相同
  • 用户收藏的公司清单也 各不相同 ,也就是说,即便我们按字母顺序排序每个清单, favoriteCompanies[i] != favoriteCompanies[j]仍然成立。
  • 所有字符串仅包含小写英文字母。

这一题最开始想着先对List进行排序(size排序和子List排序),但是对list排序比较复杂,处理起来不方便;然后想到可不可以借用Set集合来辅助判断,但是我想的是先将所有的List都转为Set然后来判断,越想越麻烦就不想做了;最后参考提交的解答发现Set中有containsAll(List list)来判断是否为子集的方法,这样就豁然开朗了。(主要还是用Set少了,以后要都看看)

public List<Integer> peopleIndexes(List<List<String>> favoriteCompanies) {
   List<Integer> res = new ArrayList<>(); //记录结果
   if(favoriteCompanies.size() == 1) {
      res.add(0);
      return res;
   }

   boolean flag = true; //标识是否为子集
   for(int i=0;i<favoriteCompanies.size();i++){
      List<String> checkOne = favoriteCompanies.get(i);
      flag = true;
      for(int j=0;j<favoriteCompanies.size();j++){
         if(i==j) continue;
         List<String> second = favoriteCompanies.get(j);
         //利用Set集合来辅助判断
         Set<String> set = new HashSet<>(second);
         if(set.containsAll(checkOne)){
            //为子集
            flag = false;
            break;
         }
      }
      if(flag) res.add(i);
   }

   return res;
}

5415. 圆形靶内的最大飞镖数量

墙壁上挂着一个圆形的飞镖靶。现在请你蒙着眼睛向靶上投掷飞镖。

投掷到墙上的飞镖用二维平面上的点坐标数组表示。飞镖靶的半径为 r

请返回能够落在 任意 半径为 r 的圆形靶内或靶上的最大飞镖数。

示例 1:
LeetCode第189场周赛_第1张图片

输入:points = [[-2,0],[2,0],[0,2],[0,-2]], r = 2
输出:4
解释:如果圆形的飞镖靶的圆心为 (0,0) ,半径为 2 ,所有的飞镖都落在靶上,此时落在靶上的飞镖数最大,值为 4 。

示例 2:
LeetCode第189场周赛_第2张图片

输入:points = [[-3,0],[3,0],[2,6],[5,4],[0,9],[7,8]], r = 5
输出:5
解释:如果圆形的飞镖靶的圆心为 (0,4) ,半径为 5 ,则除了 (7,8) 之外的飞镖都落在靶上,此时落在靶上的飞镖数最大,值为 5 。

示例 3:

输入:points = [[-2,0],[2,0],[0,2],[0,-2]], r = 1
输出:1

示例 4:

输入:points = [[1,2],[3,5],[1,-1],[2,3],[4,1],[1,3]], r = 2
输出:4

提示:

  • 1 <= points.length <= 100
  • points[i].length == 2
  • -10^4 <= points[i][0], points[i][1] <= 10^4
  • 1 <= r <= 5000

更新中。。。。。。。

你可能感兴趣的:(数据结构与算法(刷题))