心情
题目在此
第二次打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;
}
};
第四题(删除系统中的重复文件夹)
未完待续(可能 已经完了😭)