题目1 2325. 解密消息
思路
使用map完成题目的要求,注意处理空格字符
代码
class Solution {
public String decodeMessage(String key, String message) {
Map<Character,Character> mp = new HashMap<>();
int t = 0;
for(int i=0;i<key.length();i++){
char c = key.charAt(i);
if(c!=' ' && !mp.containsKey(c)){
char d = (char)('a'+t%26);
mp.put(c,d);
t++;
}
}
String res = "";
for(char c:message.toCharArray()){
if(c == ' ') {
res+=c;
continue;
}
res += mp.get(c);
}
return res;
}
}
题目2 2326. 螺旋矩阵 IV
思路
用left,right,up,down去模拟螺旋矩阵的螺旋
代码
class Solution {
public int[][] spiralMatrix(int m, int n, ListNode head) {
int[][] res =new int[m][n];
int up = 0, down =m-1;
int left = 0, right = n-1;
int num=0;
int cur = -1;
if(head!=null){
cur = head.val;
head = head.next;
}
while(num<m*n){
for(int i=left;i<=right;i++){
res[up][i]=cur;
num++;
cur=-1;
if(head!=null){
cur = head.val;
head = head.next;
}
}
up++;
if(up>down){
break;
}
for(int i=up;i<=down;i++){
res[i][right]=cur;
num++;
cur=-1;
if(head!=null){
cur = head.val;
head = head.next;
}
}
right--;
if(left>right){
break;
}
for(int i=right;i>=left;i--){
res[down][i]=cur;
num++;
cur=-1;
if(head!=null){
cur = head.val;
head = head.next;
}
}
down--;
if(up>down){
break;
}
for(int i=down;i>=up;i--){
res[i][left]=cur;
num++;
cur=-1;
if(head!=null){
cur = head.val;
head = head.next;
}
}
left++;
if(left>right){
break;
}
}
return res;
}
}
题目3 2327. 知道秘密的人数
参考题解
思路1
刷表法
将人分为3类
A 可传播秘密的人
B 还不能传播秘密的人
C 已经忘记的人
f[i]表示A类人的人数,A的人数可以去更新[i+delay,i+forget)这个区间A的人数
如果 i+delay>=n 那么 更新B的人数,因为此时超过n天,A类人转换成B类人
最后的答案应该是 第n-1天(从0开始计算的话)A类的人数+B类的人数。
代码1
public int peopleAwareOfSecret(int n, int delay, int forget) {
int[] f = new int[n]; //从0开始
int cntB = 0;
f[0] = 1;
for(int i=0;i<n;i++){
if(i+delay>=n) cntB = (cntB + f[i]) % mod;
for(int j=i+delay;j<Math.min(i+forget,n);j++){
f[j] = (f[j] + f[i]) % mod;
}
}
return (f[n-1]+cntB) % mod;
}
思路2 dp
定义f[i]是第i天新增的可以传播秘密的人
f[i]可以由 [n-forget+1,i-delay]
ans = [n-forget+1,n]区间
代码2
class Solution {
int mod = (int)1e9 + 7;
public int peopleAwareOfSecret(int n, int delay, int forget) {
int[] preSum = new int[n+1]; //从0开始
int f = 1; //第1天的新增的发现秘密的人数
//天数从2开始计算
preSum[1] = 1;
for(int i=2;i<=n;i++){ //从第1天开始
f = (preSum[Math.max(0,i-delay)] - preSum[Math.max(0,i-forget)]) % mod; //第i天新增的发现秘密的人数
preSum[i] = (f + preSum[i-1]) % mod;
}
return ( (preSum[n] - preSum[Math.max(0,n-forget)]) % mod + mod )%mod;
}
}