题目链接: Leetcode Weekly Contest 232
写在前面:
本次周赛难度不大,有一千多人AK了,我只做出来头两道,还需多加努力。
1、1790. Check if One String Swap Can Make Strings Equal
难度:Easy
题目大意:
给出两个字符串,只能交换其中一个字符串中两个字符的位置,也可以选择什么也不做,判断能否使两个字符串相等。
思路:
找到字符串1和字符串2中两个不想同的字符,如何对字符串1中的两个字符进行交换操作,再判断两个字符串是否相等。
代码
class Solution {
public boolean areAlmostEqual(String s1, String s2) {
StringBuffer sb1=new StringBuffer(s1);
StringBuffer sb2=new StringBuffer(s2);
int diffCount=0;//字符不想相同的个数
char[] diffChar=new char[2];//不同的字符
int[] diffIndex=new int[2];//不同字符的下标
for(int i=0;i<sb1.length();i++){
if(sb1.charAt(i)!=sb2.charAt(i)){
diffIndex[diffCount]=i;
diffChar[diffCount]=sb1.charAt(i);
diffCount++;
}
if(diffCount==2){
break;
}
}
if(diffCount==0){
return true;
}
for(int i=0;i<2;i++){//交换两个不同的字符的位置
int index=diffIndex[i];
sb1.setCharAt(index,diffChar[1-i]);
}
for(int i=0;i<sb1.length();i++){
if(sb1.charAt(i)!=sb2.charAt(i)){
return false;
}
}
return true;
}
}
2、1791. Find Center of Star Graph
难度:Medium
题目大意:
找无向图的中心节点。
思路:
中心节点和每个节点都有连接,所以找出表示边连接的数组中找出公共元素即可。
代码
class Solution {
public int findCenter(int[][] edges) {
int first=edges[0][0];
int second=edges[0][1];
int center=-1;
for(int i=1;i<edges.length;i++){
if(first==edges[i][0]||first==edges[i][1]){
center=first;
break;
}
center=second;
break;
}
return center;
}
}
3、1792. Maximum Average Pass Ratio
难度:Medium
题目大意:
给出一些班级的学生总数和能通过考试的学生人数,另外还有若干个学霸,这些学霸参加考试肯定能通过,将这些学霸分配到这些班级中,使得这些班级的平均考试通过率达到最高。
思路:
每次将一个学霸分配到对考试通过率提升最大的班级中去,用优先队列来寻找这样的班级。
代码
class Solution {
public double maxAverageRatio(int[][] classes, int extraStudents) {
Queue<double[]> pq=new PriorityQueue<>((a,b)->{
double x=(a[0]+1)/(a[1]+1)-a[0]/a[1];//通过率的增量
double y=(b[0]+1)/(b[1]+1)-b[0]/b[1];
if(y>x){按通过率的增量从大到小排列
return 1;
}
else if(y<x){
return -1;
}
else{
return 0;
}
});
for(int[] c:classes){//一开始变量名不是用c而是用class,后来才发现class是关键字
pq.offer(new double[]{c[0],c[1]});
}
while(extraStudents-->0){
double[] c=pq.poll();
pq.offer(new double[]{c[0]+1,c[1]+1});
}
double sum=0;
while(!pq.isEmpty()){
double[] c=pq.poll();
sum+=c[0]/c[1];
}
return sum/classes.length;
}
}
4、1793. Maximum Score of a Good Subarray
难度:Hard
题目大意:
详见题目,与Leetcode84类似。
思路
参考高赞回答,贪心思想,遍历子序列的长度1~n,每次长度增加时都尽可能地让最小值减少得少一些。
代码
class Solution {
public int maximumScore(int[] nums, int k) {
int n=nums.length;
int left=k,right=k,mini=nums[k];
int maxScore=nums[k];
while(left>0||right<n-1){
if(left==0){
right++;
}
else if(right==n-1){
left--;
}
else if(nums[left-1]<nums[right+1]){
right++;
}
else{
left--;
}
mini=Math.min(mini,Math.min(nums[left],nums[right]));
int score=mini*(right-left+1);
if(score>maxScore){
maxScore=score;
}
}
return maxScore;
}
}