Leetcode Weekly Contest 235(详细解析)

题目链接: Leetcode Weekly Contest 235

写在前面:

本次周赛难度不大,拼手速,做出了前三道,第四道没有想出来,属于数学题。

1、1816. Truncate Sentence

难度:Easy

题目大意:

字符串中各个单词用空格分隔,返回前k个单词。

思路:

统计空格的个数,注意最后一个单词后面没有空格。

代码

class Solution {
    public String truncateSentence(String s, int k) {
        StringBuffer sb=new StringBuffer();
        int space=0;
        for(int i=0;i<s.length();i++){
            if(s.charAt(i)==' '){
                space++;
                if(space==k){
                    sb.append(s.substring(0,i));
                    break;
                }
            }
        }
        if(space<k){
            return s;
        }
        return sb.toString();
    }
}

2、1817. Finding the Users Active Minutes

难度:Medium

题目大意:

详见题目。

思路:

按题目模拟即可。

代码

class Solution {
    public int[] findingUsersActiveMinutes(int[][] logs, int k) {
        Map<Integer,Set<Integer>> map=new HashMap<>();
        for(int[] log:logs){
            int id=log[0],minute=log[1];
            if(!map.containsKey(id)){
                Set<Integer> set=new HashSet<>();
                set.add(minute);
                map.put(id,set);
            }
            else{
                if(!map.get(id).contains(minute)){
                    Set<Integer> set=map.get(id);
                    set.add(minute);
                    map.put(id,set);
                }
            }
        }
        int[] ans=new int[k];
        for(Integer n:map.keySet()){
            int size=map.get(n).size();
            size--;
            ans[size]++;
        }
        return ans;
    }
}

3、1818. Minimum Absolute Sum Difference

难度:Medium

题目大意:

详见题目。

思路:

错误思路:
先求出绝对值差最大的数组元素所在的位置,然后暴力,将该位置的元素依次用其它元素代替,找到最小绝对值差。
正确思路:
参考高赞回答,遍历nums1[ ]中的每个元素,看看替换掉该元素结果能获得的降低量,寻找最大的降低量。

代码

class Solution {
    public int minAbsoluteSumDiff(int[] nums1, int[] nums2) {
        int M=1000000007;
        long sum=0;
        TreeSet<Integer> set=new TreeSet<>();
        for(int i=0;i<nums1.length;i++){
            int diff=Math.abs(nums1[i]-nums2[i]);
            sum=sum+diff;
            set.add(nums1[i]);
        }
        int maxDcrements=0;
        for(int i=0;i<nums1.length;i++){
            int diff=Math.abs(nums1[i]-nums2[i]);
            Integer ceil=set.ceiling(nums2[i]);
            if(ceil!=null){
                maxDcrements=Math.max(maxDcrements,diff-Math.abs(nums2[i]-ceil));
            }
            Integer floor=set.floor(nums2[i]);
            if(floor!=null){
                maxDcrements=Math.max(maxDcrements,diff-Math.abs(floor-nums2[i]));
            }
        }
        return (int)((sum-maxDcrements)%M);
    }
}

4、1819. Number of Different Subsequences GCDs

难度:Hard

题目大意:

求数组子序列最大公约数有多少种可能的取值。

思路

参考高赞回答。是一道数学题。

代码

class Solution {
    //如果数组的子序列中所有是q的倍数的元素的最大公约数是q,则q是子序列的最大公约数
    public int countDifferentSubsequenceGCDs(int[] nums) {
        int[] factor=new int[200001];//factor[i]表示nums[]中所有能整除i的元素的最大公约数
        for(int i=0;i<nums.length;i++){
            for(int j=1;j*j<=nums[i];j++){
                if(nums[i]%j==0){
                    int x=j;
                    int y=nums[i]/j;
                    if(factor[x]==0){
                        factor[x]=nums[i];
                    }
                    else{
                        factor[x]=gcd(factor[x],nums[i]);
                    }
                    if(factor[y]==0){
                        factor[y]=nums[i];
                    }
                    else{
                        factor[y]=gcd(factor[y],nums[i]);
                    }
                }
            }
        }
        int res=0;
        for(int i=1;i<200001;i++){
            if(factor[i]==i){
                res++;
            }
        }
        return res;
    }
    public int gcd(int a,int b){//
        while(b!=0){
            int t=a;
            a=b;
            b=t%b;
        }
        return a;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值