LeetCode第251场周赛

2E46A3417181C5E2285BE8A1CAEC87ED

心情

题目在此
第二次打LeetCode,内心平静,本来可以写出三道的,时间复杂度判断失误😰,就写出题两道。

第一题(字符串转化后的各位数字之和)

分解数字。

第二题(子字符串突变后可能得到的最大整数)

在找到必须要交换的数字前,相等的不要要换,找到最大的之后连续的可以交换的都换,直到碰到不能换的直接break。注意标记一下就好。

class Solution {
public:
    string maximumNumber(string s, vector<int>& c) {
        int le = s.size();
        string st = "";
        int i;
        int f = 0;
        for (i = 0; i < le; i++){
            int t = s[i]-'1'+1;
            if(t < c[t]){
                st+=c[t]+'0';
                f = 1;
            }else if(t==c[t]&&f==0)st+=s[i];
            else if(t==c[t]&&f==1){
                st+=c[t]+'0';
                f = 1;
            } else if(f==0) st+=s[i];
            else if(f)break;
        }
        for (; i < le; i++)st+=s[i];
        return st;
    }
};

第三题(最大兼容性评分和)

在这里插入图片描述

比赛时我算错时间复杂度了😭
直接暴力。(全排列,二进制枚举,DFS爆搜)都可以。
用一个全排列直接可以算出。枚举所有学生排列情况和老师比较。时间复杂度最大为!8*8 = 322,560
这题还有可以优化的地方:
优化1:可以事先枚举好每个老师和学生的得分。
优化2:可以通过异或求出错误答案,用总分减去错误得分。

class Solution {
public:
    int t[10],p[10],ans = 0,n,m;
    int maxCompatibilitySum(vector<vector<int>>& a, vector<vector<int>>& b) {
        n = a.size(),m = b[0].size();
        for (int i = 0; i < n; i ++)p[i] = i;
        for(int i = 0; i < n; i ++){
            int temp = 1;
            for (int j = m-1; j >= 0; j --){
                if (a[i][j]) t[i] += temp;
                temp *= 2;
            }
        }
        do{
            int res = 0;
            for (int i = 0; i < n; i++){
                for (int j = m-1,k = 0; j >= 0; j--,k++){
                    int x = t[p[i]] >> j & 1;
                    if (x==b[i][k])res++;
                }
            }
            ans = max(ans,res);
        }while(next_permutation(p,p+n));
        return ans;
    }
};

第四题(删除系统中的重复文件夹)

未完待续(可能 已经完了😭)

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值