Leetcode Weekly Contest 243(详细解析)

题目链接: Leetcode Weekly Contest 243

写在前面:

本次周赛做出了前两题。

1、1880. Check if Word Equals Summation of Two Words

难度:Easy

题目大意:

将字符串按照题意规则转化成相应的值。

思路:

模拟即可 。

代码

class Solution {
    public boolean isSumEqual(String firstWord, String secondWord, String targetWord) {
        int first=convert(firstWord);
        int second=convert(secondWord);
        int target=convert(targetWord);
        return first+second==target;
    }
    public int convert(String s){
        int num=0;
        char[] arr=s.toCharArray();
        int n=s.length();
        for(int i=0;i<n;i++){
            num=num*10+(arr[i]-'a');
        }
        return num;
    }
}

2、1881. Maximum Value after Insertion

难度:Medium

题目大意:

详见题目。

思路:

如果n为非负数数就从n的最高位开始寻找比x小的那一位,然后把x插在这个位置,如果n为正数就从n的最高位开始寻找比x小的那一位,然后把x插在这个位置。如果n为负数就从n的最高位开始寻找比x大的那一位,然后把x插在这个位置。

代码

class Solution {
    public String maxValue(String n, int x) {
        StringBuilder sb=new StringBuilder(n);
        char[] arr=n.toCharArray();
        int len=n.length();
        int index=len;
        if(arr[0]!='-'){//如果是正数
            for(int i=0;i<len;i++){
                if(arr[i]-'0'<x){//寻找比x小的数
                    index=i;
                    break;
                }
            }
        }
        else{
            for(int i=0;i<len;i++){
                if(arr[i]-'0'>x){
                    index=i;
                    break;
                }
            }
        }
        sb.insert(index,x);
        return sb.toString();
    }
}

3、1882. Process Tasks Using Servers

难度:Medium

题目大意:

详见题目。

思路:

参考高赞回答。用两个优先队列分别存储空闲服务器和运行中服务器的信息。

代码

class Solution {
    public int[] assignTasks(int[] servers, int[] tasks) {
        PriorityQueue<int[]> available=new PriorityQueue<>((a,b)->a[0]!=b[0]?a[0]-b[0]:a[1]-b[1]);
        for(int i=0;i<servers.length;i++){
            available.offer(new int[]{servers[i],i});
        }
        PriorityQueue<int[]> running=new PriorityQueue<>((a,b)->a[0]-b[0]);
        按开始空闲的时刻升序排序
        int N=tasks.length;
        int[] res=new int[N];
        int time=0;//当前时刻
        int i=0;
        while(i<N){
            while(!running.isEmpty()&&running.peek()[0]<=time){
                int[] server=running.poll();
                int index=server[1];
                available.offer(new int[]{servers[index],index});
            }
            while(!available.isEmpty()&&i<N&&time>=i){
                int[] server=available.poll();
                int index=server[1];
                running.offer(new int[]{time+tasks[i],index});
                res[i++]=index;
            }
            if(available.isEmpty()){
                time=running.peek()[0];
            }
            else{
                time=i;
            }
        }
        return res;
    }
}

4、1883. Minimum Skips to Arrive at Meeting On Time

难度:Hard

题目大意:

详见题目。

思路

参考高赞回答, 通过动态规划求解。注意浮点数运算所带来的误差。

代码

class Solution {
    public int minSkips(int[] dist, int speed, int hoursBefore) {
        //参考https://leetcode-cn.com/problems/minimum-skips-to-arrive-at-meeting-on-time/solution/minimum-skips-to-arrive-at-meeting-on-ti-dp7v/
        int n=dist.length;
        double inf=1e20;
        double EPS=1e-8;//浮点数精度误差
        double[][] f=new double[n+1][n+1];
        //f[i][j]表示走过i段路(0~i-1),跳跃j次所花费的最短时间
        for(int i=0;i<=n;i++){
            for(int j=0;j<=n;j++){
                f[i][j]=inf;
            }
        }
        f[0][0]=0;
        for(int i=1;i<=n;i++){
            for(int j=0;j<=i;j++){
                if(j!=i){//不跳过
                    f[i][j]=Math.min(f[i][j],Math.ceil(f[i-1][j]+(double)dist[i-1]/speed-EPS));
                }
                if(j!=0){//跳过
                    f[i][j]=Math.min(f[i][j],f[i-1][j-1]+(double)dist[i-1]/speed);
                }
            }
        }
        int res=-1;
        for(int j=0;j<=n;j++){
            if(f[n][j]-EPS<=hoursBefore){
                return j;
            }
        }
        return res;
    }
}
上一篇:计算机网络漫谈:OSI七层模型与TCP/IP四层(参考)模型


下一篇:【杭电多校4】2020 Multi-University Training Contest 4