emmm今天又是两题选手,第三题可以暴力,但是比赛期间没有正确实现,比赛结束后做出来了。。。第四题根本没看。以后考虑问题要更全面、细致一些,避免出现因为笔误导致的罚时😭
第一题–5823. 字符串转化后的各位数字之和
思路
这个题还是非常简单的,
- 首先把
字母转为数字
,存在字符串中; - 然后根据
k
的值,将字符串的每一位依次转为int进行相加
; - 最后返回
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. 子字符串突变后可能得到的最大整数
思路
这个题需要注意以下两点:
- 只能修改
连续子串
,需要注意的是,相等的也可以进行替换操作,也算是进行了修改; - 是
string中的字符i
对应change[i]
,而不是string中的第i个元素
对应change[i]
;
因为题目要求是求最大值,所以对于字符串num,应从左到右进行遍历,寻找可以替换的可能性,这样才能达到求最大值的要求。
算法步骤:
- 对于字符串num,从左至右对其中的字符依次进行遍历;
- 如果当前字符对于的数字i小于等于change[i],且在此之前没有进行过替换操作(即sign=0),则开始替换,直至当前字符对于的数字i小于等于change[i]不成立为止;
- 把num中后续的字符直接放到最终的结果中;
- 返回结果。
代码
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的值更大的话,此方法就不再适用了。
算法步骤:
- 计算每一个学生与每一位老师的兼容性,得到一个 m × m m\times m m×m的矩阵pre;
- 使用函数permutation求解0-(m-1)的全排列,如"012"的全排列为"012"、“021”、“120”、“102”、“201”、“210”;
- 然后根据全排列(也就是每种可能性)求解对应的兼容评分和,求得其中的最大值ans;
- 返回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;
}
}
第四题
思路
根本就没看,以后有时间再做