题目链接: Leetcode Weekly Contest 251
写在前面:
本次周赛没有打,在比赛后进行模拟。做出了前两道。
1、1945. Sum of Digits of String After Convert
难度:Easy
题目大意:
将字符串按照规则转化成数字,再将数字各个位上的数相加求和。
思路:
按题意模拟即可。
class Solution {
public int getLucky(String s, int k) {
char[] arr=s.toCharArray();
int[] value=new int[arr.length];
for(int i=0;i<arr.length;i++){
value[i]=arr[i]-'a'+1;//用数组来存,不然即使用long类型来存也会溢出
}
int num=0;
for(int i=0;i<value.length;i++){
if(value[i]<10){
num+=value[i];
}
else{
num+=(value[i]%10);
num+=(value[i]/10);
}
}
k--;
int res=num;
while(k-->0){
res=0;
while(num>0){
res+=(num%10);
num/=10;
}
num=res;
}
return (int)res;
}
}
2、1946. Largest Number After Mutating Substring
难度:Medium
题目大意:
详见题意。
思路:
贪心算法,从最高位开始遍历,如果能替换后能使数字变大就就行替换。注意替换的位置要连续。
代码
class Solution {
public String maximumNumber(String num, int[] change) {
char[] arr=num.toCharArray();
int n=arr.length;
int changedIndex=-1;
for(int i=0;i<n;i++){
if(changedIndex==-1){
if(change[arr[i]-'0']>arr[i]-'0'){
arr[i]=(char)(change[arr[i]-'0']+'0');
changedIndex=i;
}
}
else{
if(i-changedIndex==1&&change[arr[i]-'0']>=arr[i]-'0'){
arr[i]=(char)(change[arr[i]-'0']+'0');
changedIndex=i;
}
else{
break;
}
}
}
return String.valueOf(arr);
}
}
3、1947. Maximum Compatibility Score Sum
难度:Medium
题目大意:
给出若干个导师和学生的问卷答案,为每个学生安排一位导师(每个导师也只能有一名学生)使得总体的契合度最高(问卷答案相似度越高则契合度越高)。
思路:
数据量比较小,对导师进行全排列,然后和学生进行匹配来求最高契合度。全排列问题用回溯来求解。
代码
class Solution {
int max=0;
public int maxCompatibilitySum(int[][] students, int[][] mentors) {
int m=mentors.length;
boolean[] visited=new boolean[m];//记录mentors[]中的元素是否被访问过
backtrack(visited,students,mentors,0,0);
return max;
}
public void backtrack(boolean[] visited,int[][] students,int[][] mentors,int pos,int score){
//pos表示按顺序已经访问过的学生的个数
if(pos==students.length){
max=Math.max(score,max);
return;
}
for(int i=0;i<mentors.length;i++){
//对mentors进行全排列
if(!visited[i]){
visited[i]=true;
backtrack(visited,students,mentors,pos+1,score+score(students[pos],mentors[i]));
visited[i]=false;
}
}
}
public int score(int[] student,int[] mentor){
int res=0;
for(int i=0;i<student.length;i++){
if(student[i]==mentor[i]){
res++;
}
}
return res;
}
}
4、1948. Delete Duplicate Folders in System
难度:Hard
题目大意:
详见题目。
思路
暂时不会
代码
//