题目链接: 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;
}
}