文章目录
- 2432. 处理用时最长的那个任务的员工5.5
- 1419. 数青蛙5.6
- 1010. 总持续时间可被 60 整除的歌曲5.7
- 2290. 到达角落需要移除障碍物的最小数目5.8
- 2437. 有效时间的数目5.9
2432. 处理用时最长的那个任务的员工5.5
共有 n 位员工,每位员工都有一个从 0 到 n - 1 的唯一 id 。
给你一个二维整数数组 logs ,其中 logs[i] = [idi, leaveTimei] :
- idi 是处理第 i 个任务的员工的 id ,且leaveTimei 是员工完成第 i 个任务的时刻。所有 leaveTimei 的值都是 唯一 的。
- 注意,第 i 个任务在第 (i - 1) 个任务结束后立即开始,且第 0 个任务从时刻 0 开始。
返回处理用时最长的那个任务的员工的 id 。如果存在两个或多个员工同时满足,则返回几人中 最小 的 id 。
思路
使用枚举法将每一位员工的用时计算出来
public class Sulotion2432 {public int hardestWorker(int n, int[][] logs) {if (n == 1) {return 0;}int res = logs[0][1];int flag = logs[0][0];for (int i = 1; i < logs.length; i++) {int usid = logs[i][0];int temp = logs[i][1] - logs[i - 1][1];if (temp > res || (temp == res && usid < flag)) {res = temp;flag = logs[i][0];}}return flag;}
}
1419. 数青蛙5.6
- 给你一个字符串 croakOfFrogs,它表示不同青蛙发出的蛙鸣声(字符串 “croak” )的组合。由于同一时间可以有多只青蛙呱呱作响,所以 croakOfFrogs 中会混合多个 “croak” 。
- 请你返回模拟字符串中所有蛙鸣所需不同青蛙的最少数目。
- 要想发出蛙鸣 “croak”,青蛙必须 依序 输出 ‘c’, ’r’, ’o’, ’a’, ’k’ 这 5 个字母。如果没有输出全部五个字母,那么它就不会发出声音。如果字符串 croakOfFrogs 不是由若干有效的 “croak” 字符混合而成,请返回 -1 。
思路
使用计数的方式,创建一个数组,判断当前字符出现的次数以及当前字符的顺序(遍历后面字符的时候会判断前一个是否为0,以此来形成一个有顺序的鸣叫),如果当前字符合理,就将当前的数组计数加一,将前一个数组计数减一。因此当最终遍历完成如果有效的话所有计数应当全部为0;要判断同时有几只青蛙,只需要判断在数组中同时出现的最大数目。
public class Sulotion1419 {public static int minNumberOfFrogs(String croakOfFrogs) {if (croakOfFrogs.length() % 5 != 0) {return -1;}int[] count = new int[4];int res = 0;for (int i = 0; i < croakOfFrogs.length(); i++) {char c = croakOfFrogs.charAt(i);if (c != 'c' & c != 'r' & c != 'o' & c != 'a' & c != 'k'){return -1;}switch (c){case 'c': count[0]++; break;case 'r': if(count[0]==0) return -1; count[0]--; count[1]++; break;case 'o': if(count[1]==0) return -1; count[1]--; count[2]++; break;case 'a': if(count[2]==0) return -1; count[2]--; count[3]++; break;case 'k': if(count[3]==0) return -1; count[3]--; break;}// 判断同时有几只青蛙在叫res = Math.max(res, count[0]+count[1]+count[2]+count[3]);}// 判断叫声是否完整return count[0]+count[1]+count[2]+count[3] == 0 ? res : -1;}
}
1010. 总持续时间可被 60 整除的歌曲5.7
- 在歌曲列表中,第 i 首歌曲的持续时间为 time[i] 秒。
- 返回其总持续时间(以秒为单位)可被 60 整除的歌曲对的数量。形式上,我们希望下标数字 i 和 j 满足 i < j 且有 (time[i] + time[j]) % 60 == 0。
思路
使用双重for循环显然是可以直接实现的,但是那样的话时间复杂度是O(n^2)。
所以我们的思路是创建一个长度为61数组,用来记录当前索引数下的数字量,当一个数对60取余得到的数加上60减去这个数的值必定可以对60取余为0,所以只需记录遍历的数对60取余对应的数组的索引,然后将所有与之相加为60的数的数量记录下来。
public class Sulotion1010 {public int numPairsDivisibleBy60(int[] time) {int res = 0;int[] count = new int[61];for (int i = 0; i < time.length; i++) {res += count[(60 - time[i] % 60) % 60];count[time[i] % 60]++;}return res;}
}
2290. 到达角落需要移除障碍物的最小数目5.8
- 给你一个下标从 0 开始的二维整数数组 grid ,数组大小为 m x n 。每个单元格都是两个值之一:
0 表示一个 空 单元格, - 1 表示一个可以移除的 障碍物 。
- 你可以向上、下、左、右移动,从一个空单元格移动到另一个空单元格。
- 现在你需要从左上角 (0, 0) 移动到右下角 (m - 1, n - 1) ,返回需要移除的障碍物的 最小 数目。
这个题优点难度,目前自己完全不能解决,等后续持续学习
这个题主要用到图的广度优先遍历
2437. 有效时间的数目5.9
- 给你一个长度为 5 的字符串 time ,表示一个电子时钟当前的时间,格式为 “hh:mm” 。最早 可能的时间是 “00:00” ,最晚 可能的时间是 “23:59” 。
- 在字符串 time 中,被字符 ? 替换掉的数位是 未知的 ,被替换的数字可能是 0 到 9 中的任何一个。
- 请你返回一个整数 answer ,将每一个 ? 都用 0 到 9 中一个数字替换后,可以得到的有效时间的数目。
思路
时间一共由四个数组组成,将这四个数字分离出来进行单独判断
import java.util.ArrayList;public class Sulotion2437 {public int countTime(String time) {int res = 1;ArrayList<Integer> arrayList = new ArrayList();String[] str = time.split("");if (str[0].equals("?") && str[1].equals("?")) {res *= 24;} else {if (str[0].equals("?")) {if (Integer.parseInt(str[1]) < 4) {res *= 3;} else {res *= 2;}}if (str[1].equals("?")) {if (Integer.parseInt(str[0]) == 2) {res *= 4;} else {res *= 10;}}}if (str[3].equals("?")) {res *= 6;}if (str[4].equals("?")) {res *= 10;}return res;}
}