Leetcode Weekly Contest 251(回溯、贪心)

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

题目大意:

详见题目。

思路

暂时不会

代码

 //
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值