【LeetCode】周赛纪录(一)第 189 场周赛20200517

第189场周赛

    • 1450. 在既定时间做作业的学生人数
      • 题目描述
      • Solution
    • 1451. 重新排列句子中的单词
      • 题目描述
      • Solution
    • 1452. 收藏清单
      • 题目描述
      • Solution
    • 1453. 圆形靶内的最大飞镖数量
      • 题目描述
      • Solution

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

题目描述

难度:简单
给你两个整数数组 startTime(开始时间)和 endTime(结束时间),并指定一个整数 queryTime 作为查询时间。
已知,第 i 名学生在 startTime[i] 时开始写作业并于 endTime[i] 时完成作业。
请返回在查询时间 queryTime 时正在做作业的学生人数。形式上,返回能够使 queryTime 处于区间 [startTime[i], endTime[i]](含)的学生人数。
直达链接
示例:

输入:startTime = [4], endTime = [4], queryTime = 4
输出:1
解释:在查询时间只有一名学生在做作业。

Solution

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

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

题目描述

难度:中等
「句子」是一个用空格分隔单词的字符串。给你一个满足下述格式的句子 text :
句子的首字母大写
text 中的每个单词都用单个空格分隔。
请你重新排列 text 中的单词,使所有单词按其长度的升序排列。如果两个单词的长度相同,则保留其在原句子中的相对顺序。
请同样按上述格式返回新的句子。
直达链接

示例:

输入:text = “Leetcode is cool”
输出:“Is cool leetcode”
解释:句子中共有 3 个单词,长度为 8 的 “Leetcode” ,长度为 2 的 “is” 以及长度为 4 的 “cool” 。
输出需要按单词的长度升序排列,新句子中的第一个单词首字母需要大写。
输入:text = “Keep calm and code on”
输出:“On and keep calm code”
解释:输出的排序情况如下:
“On” 2 个字母。
“and” 3 个字母。
“keep” 4 个字母,因为存在长度相同的其他单词,所以它们之间需要保留在原句子中的相对顺序。
“calm” 4 个字母。
“code” 4 个字母。

Solution

  • 思路一:自己周赛时候的思路
  1. 先把所有字母都变成小写
  2. 然后排序(根据单词长度),需要用稳定的排序方法,才能保留在原句子中的相对顺序
  3. 将首字母大写

最开始写的代码,有点乱

class Solution {
     
    public String arrangeWords(String text) {
     
        String[] str = text.toLowerCase().split(" ");
        int n = str.length;
        //排序
        for(int i = 0; i < n; ++i){
     
            boolean flag = false;
            for(int j = 0; j < n - i - 1; ++j){
     
                if(str[j].length() > str[j+1].length()){
     
                    String tmp = str[j];
                    str[j] = str[j+1];
                    str[j+1] = tmp;
                    flag = true;
                }
            }
            if(!flag) break;
        }
        //大小写
        char c = str[0].charAt(0);
        if(Character.isLowerCase(c)){
     
            c = Character.toUpperCase(c);
        }
        StringBuilder sb = new StringBuilder();
        for(String s : str){
     
            sb.append(s);
            sb.append(' ');
        }
        sb.deleteCharAt(sb.length()-1);
        sb.setCharAt(0, c);      
        return sb.toString();
    }
}

改进后的
1、排序这部分,可以用sort,修改内置的排序规则即可
2、首字母大写可以另外开辟一个StringBuilder这么复杂

class Solution {
     
    public String arrangeWords(String text) {
     
        String[] str = text.toLowerCase().split(" ");
        int n = str.length;
        //排序
        Arrays.sort(str, (o1, o2) -> {
     
            return o1.length()-o2.length();
        });
        //首字母大写
        char firstletter = str[0].charAt(0);
        firstletter = (char)(firstletter - 32);
        String firstword = firstletter + str[0].substring(1);
        str[0] = firstword;
        String ans = "";
        ans = String.join(" ", str);
        return ans;
    }
}

tips

  1. Arrays.sort内部用的是什么排序方法
  2. 字符串相关操作函数

1452. 收藏清单

题目描述

给你一个数组 favoriteCompanies ,其中 favoriteCompanies[i] 是第 i 名用户收藏的公司清单(下标从 0 开始)。
请找出不是其他任何人收藏的公司清单的子集的收藏清单,并返回该清单下标。下标需要按升序排列。
示例:

输入: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]

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

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

Solution

双重循环,用HashSet来看是否是子集。

class Solution {
     
    public List<Integer> peopleIndexes(List<List<String>> favoriteCompanies) {
     
        List<Integer> result = new ArrayList<>();
        int n = favoriteCompanies.size();
        for(int i = 0; i < n; i++){
     
            List<String> list1 = favoriteCompanies.get(i);
            boolean flag = true;
            for(int j = 0; j < n; j++){
     
                if(i == j){
     
                    //自己跟自己比,跳过
                    continue;
                }
                //比较,如果是子集,置flag为false
                List<String> list2 = favoriteCompanies.get(j);
                Set<String> set = new HashSet<>(list2);
                if(set.containsAll(list1)){
     
                    flag = false;
                    break;
                }
            }
            if(flag){
     
                result.add(i);
            }
        }
        return result;
    }
}

tips:

  1. 根据list创建HashSet
    Set< String > set = new HashSet<>(list2);
  2. set.containsAll(list1)

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

题目描述

难度:困难
墙壁上挂着一个圆形的飞镖靶。现在请你蒙着眼睛向靶上投掷飞镖。
投掷到墙上的飞镖用二维平面上的点坐标数组表示。飞镖靶的半径为 r 。
请返回能够落在 任意 半径为 r 的圆形靶内或靶上的最大飞镖数。
直达链接
【LeetCode】周赛纪录(一)第 189 场周赛20200517_第1张图片
【LeetCode】周赛纪录(一)第 189 场周赛20200517_第2张图片

Solution

待更新

你可能感兴趣的:(LeetCode,数据结构与算法,leetcode,算法,数据结构,java,字符串)