LeetCode 第 150 场周赛
一、拼写单词(LeetCode-1160)
1.1 题目描述

1.2 解题思路
由于给定的chars,每个字母只能用一次,所以用大小为26的数组charsArray来表示a-z(例如charsArray[0]代表字符a可以使用的次数,charsArray[25]代表字符z可以使用的次数),存放某字符的可使用的个数。
遍历单词列表,复制一份charsArray,使用一次,就将单词可使用次数减1。
若需要用到的字符时,该在charsArray的数量为0,则该单词不符合条件。
1.3 实现代码
class Solution {
public int countCharacters(String[] words, String chars) {
int[] charLib = new int[26];
int res = 0;
for (Character character : chars.toCharArray()) {
charLib[character - 'a']++;
}
OK:
for (String word : words) {
int len = word.length();
if (len > chars.length()) {
continue;
}
int[] wordLib = Arrays.copyOf(charLib, 26);
for (Character character:word.toCharArray()){
if(--wordLib[character - 'a'] <0){
continue OK;
}
}
res += len;
}
return res;
}
}
二、最大层内元素和(LeetCode-1161)
2.1 题目描述

2.2 解题思路
使用BFS完成树的层次遍历,计算层的节点值之和,找到最大的值,返回对应的最小的层数。
2.3 实现代码
public int maxLevelSum(TreeNode root) {
if (root == null) {
throw new IllegalArgumentException("invalid parameters");
}
Queue<TreeNode> queue = new ArrayDeque<>();
queue.offer(root);
int index = 0;
int sum = 0;
//当队列不是空的时候,将队列头移除,将其儿子节点加入队列
int ceng = 1;
while (!queue.isEmpty()) {
int size = queue.size();//记录当前层节点的个数
TreeNode temp;
int result = 0;
//循环size次
for (int i = 0; i < size; i++) {
temp = queue.poll();
result += temp.val;
if (temp.left != null) {
queue.offer(temp.left);
}
if (temp.right!= null) {
queue.offer(temp.right);
}
}
if (result > sum) {
index = ceng;
sum = result;
}
ceng++;
}
return index;
}
三、地图分析(LeetCode-1162)
3.1 题目描述


3.2 解题思路
使用BFS的思想解决
- 先找到所有
陆地的坐标,放到队列中 - 从队列中取出陆地坐标,找到
离陆地最近的海洋 - 若找到海洋,则层数level加1,找到的海洋都当陆地算,海洋的坐标值
grid[i][j]变为1,重新放到队列,重复2操作 - 若未找到任何海洋,则结束,返回level
3.3 实现代码
public class Solution {
class Position {
public int x;
public int y;
public Position(int x, int y) {
this.x = x;
this.y = y;
}
}
public int maxDistance(int[][] grid) {
int[] direction = {0, 1, 0, -1, 0};
int N = grid.length;
int res = 0;
Queue<Position> queue = new ArrayDeque<>();
//找到陆地
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
if (grid[i][j] == 1) {
queue.offer(new Position(i, j));
}
}
}
//全是海洋或陆地
if (queue.size() == N * N || queue.isEmpty()) {
return -1;
}
//使用BFS
while (!queue.isEmpty()) {
int size = queue.size();
int r = 0;
while (size != 0) {
Position position = queue.poll();
for (int i = 0; i < direction.length-1; i++) {
int nx = position.x + direction[i];
int ny = position.y + direction[i + 1];
if (nx < 0 || ny < 0 || nx >= N || ny >= N || grid[nx][ny] == 1) {
continue;
}
//将找到的海洋当做陆地,放到队列中
grid[nx][ny] = 1;
queue.offer(new Position(nx, ny));
r++;
}
size--;
}
//当前层的陆地能找到距离最近的海洋,则结果值+1
if(r > 0){
res++;
}
}
return res;
}
}
四、按字典序排在最后的子串(LeetCode-1163)
4.1 题目描述

4.2 解题思路
根据题意。
截取的字符串,只需要选择一个位置k,截取k及之后的字符串即为最终答案(res = s.subString(k))。

如何找到这个k?
例如zzaazcc,按照字典排序,肯定是要找到最大的字符z
存在两种情况:
- 只有一个最大字符z,返回z及之后的所有字符,作为答案
- 有多个最大字符z,例如存在2个最大字符z,对应的位置分别是x,y,则比较最大字符后面的第一位字符,即比较charArray[x+1]、charArray[y+1],根据k新的位置。
需要考虑一种特殊情况即,两个最大字符是邻位(zz),出现这种情况,我们只取index最小的(zz取前面的z的坐标)。通过charArray[i] != charArray[i-1],来排除。
4.3 实现代码
public class Solution {
public String lastSubstring(String s) {
//应该截取的字符串的起始位置res = k
int k = 0;
char[] charArray = s.toCharArray();
int len = charArray.length;
//找到最大字符首先出现位置k
for (int i = 1; i < len; i++) {
if (charArray[i] > charArray[k]) {
k = i;
}
}
//从k开始找到与k相等的字符,比较字符所在位置之后的第一个字符大小
for (int i = k + 1; i < len; i++) {
//考虑 zaazzcc的情况,两个相同字符串z出现,取index最小
if (charArray[i] == charArray[k] && charArray[i] != charArray[i - 1]) {
for (int j = 1; k + j < i && i+j < len; j++) {
if (charArray[k + j] < charArray[i + j]) {
k = i;
break;
}
if (charArray[k + j] > charArray[i + j]) {
break;
}
}
}
}
return s.substring(k);
}
public static void main(String[] args) {
String str = "zzaazcc";
str = "abab";
str = "leetcode";
Solution solution = new Solution();
String res = solution.lastSubstring(str);
System.out.println(res);
}
}
LeetCode 第 150 场周赛的更多相关文章
- LeetCode 第 165 场周赛
LeetCode 第 165 场周赛 5275. 找出井字棋的获胜者 5276. 不浪费原料的汉堡制作方案 5277. 统计全为 1 的正方形子矩阵 5278. 分割回文串 III C 暴力做的,只能 ...
- Leetcode第 217 场周赛(思维量比较大)
Leetcode第 217 场周赛 比赛链接:点这里 做完前两题我就知道今天的竞赛我已经结束了 这场比赛思维量还是比较大的. 1673. 找出最具竞争力的子序列 题目 给你一个整数数组 nums 和一 ...
- Leetcode 第133场周赛解题报告
今天参加了leetcode的周赛,算法比赛,要求速度比较快.有思路就立马启动,不会纠结是否有更好的方法或代码可读性.只要在算法复杂度数量级内,基本上是怎么实现快速就怎么来了. 比赛时先看的第二题,一看 ...
- LeetCode第151场周赛(Java)
这是我第一次写周赛的题目,而且还是虚拟的.从这次起,以后就将所有错过的题目都写到博客来.当然既然是我错的,那代码肯定不是我自己的.我会注明来源.并且我会自己敲一遍.多总结总是没坏处的. 另外比较糟糕的 ...
- LeetCode第152场周赛(Java)
这算是我第一次正式参加 LeetCode 的周赛吧.通过两道题.意料之中(通过上次模拟可以看出来).总的来说,脑袋还是不太灵光.想的有点慢.全球第一名 0:10:19 就全部通过...感觉我的智商被狠 ...
- LeetCode 第 196 场周赛 (题目:5452-5455,这是参加过最坑的周赛,暴力n^2居然可以过)
5452. 判断能否形成等差数列 给你一个数字数组 arr . 如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 . 如果可以重新排列数组形成等差数列,请返回 tru ...
- Leetcode 第137场周赛解题报告
今天的比赛的题目相对来说比较「直白」,不像前几周都是一些特定的算法,如果你没学过不可能想出来. 做了这些周,对leetcode比赛的题目也发现了一些「规律」. 一般前两道题都很「简单」,只要有想法,直 ...
- 【LeetCode第 313 场周赛】忘光光
比赛链接 最近不怎么打比赛,不能马上反应过来考察的是什么,全部忘光光了... 6192. 公因子的数目 题意: 给定 \(a\) 和 \(b\),问两者的公因子数量 数据范围:\(1\leq a,b\ ...
- Leetcode 第136场周赛解题报告
周日的比赛的时候正在外面办事,没有参加.赛后看了下题目,几道题除了表面要考的内容,还是有些能发散扩展的地方. 做题目不是最终目的,通过做题发现知识盲区,去研究学习,才能不断提高. 理论和实际是有关系的 ...
随机推荐
- S3C2440 块设备(待续)
1.块设备只能以块为单位接受输入和返回输出,而字符设备则以字节为单位 2.块设备对于I/O请求有对应的缓冲区,因此他们可以选择以什么顺序进行响应,字符设备无须缓冲且被直接读写.对于存储设备而言调整读写 ...
- docker linux下配置加速器
[root@foundation83 ~]# cd /etc/docker/[root@foundation83 docker]# vim daemon.json{ "registry-mi ...
- 一个 Git 分支协作模式的进化故事
从不用版本管理到使用 Git 分支管理的故事,也就是从这个时候开始的... 某公司只有一个程序员,一开始并没有版本管理的概念.项目开发只有一个人在参与,所以也没用版本管理工具. 后来,老板又招了两个程 ...
- javascript_11-函数面试题
函数经典面试题 1.---------------------------- // 解析器: // 预解析 全局作用域 // 先找var .function 和参数 // 找到var和function ...
- Mycat学习-单独启动mycat
Mycat下载地址:http://mycat.io/ Mycat安装:解压缩即可. Mycat作为一个中间件,实现mysql协议,是可以不依赖数据库单独运行的. 对前端应用连接来说就是一个数据库, ...
- Python函数Day4
一.内容补充 __iter__() 就是 iter(),iter() 调用的就是__iter__() __next__() 就是 next(),next()调用的就是__next__() __clos ...
- Python 渗透测试编程技术方法与实践 ------全书整理
1.整个渗透测试的工作阶段 ( 1 )前期与客户的交流阶段.( 2 )情报的收集阶段.( 3 )威胁建模阶段.( 4 )漏洞分析阶段.( 5 )漏洞利用阶段.( 6 )后渗透攻击阶段.( 7 )报告阶 ...
- MySQL运行机制原理&架构
1.MySQL知识普及: MySQL是一个开放源代码的关系数据库管理系统. MySQL架构可以在多种不同场景中应用并发挥良好作用.主要体现在存储引擎的架构上,插件式的存储引擎架构将查询处理和其它的系统 ...
- 用 Redis 实现延时任务
原文:https://cloud.tencent.com/developer/article/1358266 1.什么是延时任务 延时任务,顾名思义,就是延迟一段时间后才执行的任务.延时任务的使用还是 ...
- 如何为Spring Boot应用程序配置端口
[转]https://www.javaroad.cn/questions/11162 1 个月前 1.1通过属性文件更新 . /src/main/resources/application.prope ...