Leetcode--2021.7.25周赛

emmm今天又是两题选手,第三题可以暴力,但是比赛期间没有正确实现,比赛结束后做出来了。。。第四题根本没看。以后考虑问题要更全面、细致一些,避免出现因为笔误导致的罚时😭

第一题–5823. 字符串转化后的各位数字之和

在这里插入图片描述

思路

这个题还是非常简单的,

  1. 首先把字母转为数字,存在字符串中;
  2. 然后根据k的值,将字符串的每一位依次转为int进行相加
  3. 最后返回k次转换相加后的结果

代码

    public int getLucky(String s, int k) {
        int ans = 0;
        String cur = "";
        //字母转存为数字
        for (char ch : s.toCharArray())
        {
            cur = cur +  String.valueOf(ch-'a'+1);
        }
		//进行k次相加和转存
        for (int i=1;i<=k;i++)
        {
            ans = 0;
            for (char ch : cur.toCharArray())
            {
                ans += ch-'0';
            }
            cur = String.valueOf(ans);
        }

        return ans;
    }

第二题–5824. 子字符串突变后可能得到的最大整数

在这里插入图片描述
在这里插入图片描述

思路

这个题需要注意以下两点:

  1. 只能修改连续子串,需要注意的是,相等的也可以进行替换操作,也算是进行了修改;
  2. string中的字符i对应change[i],而不是string中的第i个元素对应change[i]

因为题目要求是求最大值,所以对于字符串num,应从左到右进行遍历,寻找可以替换的可能性,这样才能达到求最大值的要求。
算法步骤:

  1. 对于字符串num,从左至右对其中的字符依次进行遍历;
  2. 如果当前字符对于的数字i小于等于change[i],且在此之前没有进行过替换操作(即sign=0),则开始替换,直至当前字符对于的数字i小于等于change[i]不成立为止;
  3. 把num中后续的字符直接放到最终的结果中;
  4. 返回结果。

代码

class Solution {
    public String maximumNumber(String num, int[] change) {
        StringBuffer sb = new StringBuffer();

        int sign = 0;
        int c = 0;
        for (int i=0;i<num.length();)
        {
			//一定要是小于等于,因为等价替换也是修改,这样可以确保进行最大长度的字串替换
			//(测试用例有这种情况:比如"81231417"中,"1"、"2"、"3"对应的change[1]、change[2]、change[3]的值都大于他们,
			//但是"4"对应的change[4]=4,这种情况下,应该替换的字串为"123141",如果不加等号,此时替换的字串就是"1231"了)
            if (num.charAt(i)-'0'<=change[num.charAt(i)-'0'])
            {
                if (sign==0)
                {
                    while (i<num.length() && num.charAt(i)-'0'<=change[num.charAt(i)-'0'])
                    {
                        sb.append(change[num.charAt(i)-'0']);
                        i++;
                        c=1;
                    }
                    if (c==1);
                        sign=1;
                }
                else
                {//替换完成后,把剩余的直接放到结果中
                    sb.append(num.charAt(i));
                    i++;
                }
            }
            else
            {//把不需要替换的直接放到结果中
                sb.append(num.charAt(i));
                i++;
            }
        }

        return sb.toString();
    }
}

第三题—5825. 最大兼容性评分和

在这里插入图片描述

思路

因为m和n的值最大才为8,所以可以使用暴力求解。
其实本题可以转换为——对于一个 m × m m\times m m×m的矩阵,每行、每列只能取一个元素,求这m个元素和的最大值。
因为本题的m最大为8,所以只有 8 ! = 40320 8!=40320 8!=40320种可能性,直接暴力遍历,寻找最大的和即可,如果m的值更大的话,此方法就不再适用了。

算法步骤:

  1. 计算每一个学生与每一位老师的兼容性,得到一个 m × m m\times m m×m的矩阵pre;
  2. 使用函数permutation求解0-(m-1)的全排列,如"012"的全排列为"012"、“021”、“120”、“102”、“201”、“210”;
  3. 然后根据全排列(也就是每种可能性)求解对应的兼容评分和,求得其中的最大值ans;
  4. 返回ans;
    在这里插入图片描述

代码

class Solution {
    public int maxCompatibilitySum(int[][] students, int[][] mentors) {
        int m = students.length;
        int n = students[0].length;
        int [][] pre = new int[m][m];

        for (int i=0;i<m;i++)
        {
            for (int j=0;j<m;j++)
            {
                int count = 0;
                for (int k=0;k<n;k++)
                {
                    if (students[i][k] == mentors[j][k])
                        count++;
                }
                pre[i][j] = count;
            }
        }


        int ans = 0;
        Set<String> set = permutation(m);
        //根据0-(m-1)的全排列进行遍历,找到最大值
        for (String str : set)
        {
            int cur = 0;
            for (int i=0;i<m;i++)
            {
                cur += pre[i][str.charAt(i)-'0'];
            }
            ans = Math.max(ans,cur);
        }


        return ans;
    }
    
  //求解全排列
    public Set<String> permutation(int m)
    {
        int count = 1;
        for (int i=1;i<=m;i++)
            count *= i;

        Set<String> set = new HashSet<>();
        Deque<String> d = new ArrayDeque<>();

        String init = "";
        for (int i=0;i<m;i++)
            init += String.valueOf(i);

        set.add(init);
        d.addLast(init);
        while(set.size()<count)
        {
            for (int i=0;i<m;i++)
            {
                char[] cur = d.peekFirst().toCharArray();
                char temp = cur[i];
                cur[i] = cur[(i+1)%m];
                cur[(i+1)%m] = temp;
                String c = String.valueOf(cur);
                if (!set.contains(c))
                {
                    d.addLast(c);
                    set.add(c);
                }
                if (set.size()>=count)
                    break;
            }
            d.pollFirst();
        }

        return set;
    }
}

第四题

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路

根本就没看,以后有时间再做

代码

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值