一、拼写单词(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的思想解决

  1. 先找到所有陆地的坐标,放到队列中
  2. 从队列中取出陆地坐标,找到离陆地最近的海洋
  3. 若找到海洋,则层数level加1,找到的海洋都当陆地算,海洋的坐标值grid[i][j]变为1,重新放到队列,重复2操作
  4. 若未找到任何海洋,则结束,返回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 场周赛的更多相关文章

  1. LeetCode 第 165 场周赛

    LeetCode 第 165 场周赛 5275. 找出井字棋的获胜者 5276. 不浪费原料的汉堡制作方案 5277. 统计全为 1 的正方形子矩阵 5278. 分割回文串 III C 暴力做的,只能 ...

  2. Leetcode第 217 场周赛(思维量比较大)

    Leetcode第 217 场周赛 比赛链接:点这里 做完前两题我就知道今天的竞赛我已经结束了 这场比赛思维量还是比较大的. 1673. 找出最具竞争力的子序列 题目 给你一个整数数组 nums 和一 ...

  3. Leetcode 第133场周赛解题报告

    今天参加了leetcode的周赛,算法比赛,要求速度比较快.有思路就立马启动,不会纠结是否有更好的方法或代码可读性.只要在算法复杂度数量级内,基本上是怎么实现快速就怎么来了. 比赛时先看的第二题,一看 ...

  4. LeetCode第151场周赛(Java)

    这是我第一次写周赛的题目,而且还是虚拟的.从这次起,以后就将所有错过的题目都写到博客来.当然既然是我错的,那代码肯定不是我自己的.我会注明来源.并且我会自己敲一遍.多总结总是没坏处的. 另外比较糟糕的 ...

  5. LeetCode第152场周赛(Java)

    这算是我第一次正式参加 LeetCode 的周赛吧.通过两道题.意料之中(通过上次模拟可以看出来).总的来说,脑袋还是不太灵光.想的有点慢.全球第一名 0:10:19 就全部通过...感觉我的智商被狠 ...

  6. LeetCode 第 196 场周赛 (题目:5452-5455,这是参加过最坑的周赛,暴力n^2居然可以过)

    5452. 判断能否形成等差数列   给你一个数字数组 arr . 如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 . 如果可以重新排列数组形成等差数列,请返回 tru ...

  7. Leetcode 第137场周赛解题报告

    今天的比赛的题目相对来说比较「直白」,不像前几周都是一些特定的算法,如果你没学过不可能想出来. 做了这些周,对leetcode比赛的题目也发现了一些「规律」. 一般前两道题都很「简单」,只要有想法,直 ...

  8. 【LeetCode第 313 场周赛】忘光光

    比赛链接 最近不怎么打比赛,不能马上反应过来考察的是什么,全部忘光光了... 6192. 公因子的数目 题意: 给定 \(a\) 和 \(b\),问两者的公因子数量 数据范围:\(1\leq a,b\ ...

  9. Leetcode 第136场周赛解题报告

    周日的比赛的时候正在外面办事,没有参加.赛后看了下题目,几道题除了表面要考的内容,还是有些能发散扩展的地方. 做题目不是最终目的,通过做题发现知识盲区,去研究学习,才能不断提高. 理论和实际是有关系的 ...

随机推荐

  1. QuickJS 快速入门 (QuickJS QuickStart)

    1. QuickJS 快速入门 (QuickJS QuickStart) 1. QuickJS 快速入门 (QuickJS QuickStart) 1.1. 简介 1.2. 安装 1.3. 简单使用 ...

  2. ESLint——从零学起

    介绍 ESLint最初是由Nicholas C. Zakas于2013年6月创建的开源项目.它的目标是提供一个插件化的javascript代码检测工具.因此,ESLint就是一个语法规则和代码风格的检 ...

  3. java steam List指定字段去重

    如:角色去重处理 baseRoleList = baseRoleList.stream().collect(Collectors.collectingAndThen(Collectors.toColl ...

  4. c# 克隆来创建对象副本

  5. Tkinter关于新建窗口内Entry无法获取值(值全为空)的解决办法

    最近在做Python的课程作业,遇到一个问题,描述如下: 使用Python内置的Tkinter模块进行GUI编程 给一个按钮(或菜单)绑定事件,打开一个新窗口,新窗口内有Entry若干,通过textv ...

  6. Django:CSRF(Cross-request forgery)跨站请求伪造

    一.CSRF是什么 二.CSRF攻击原理 三.CSRF攻击防范 一.CSRF是什么 CSRF(Cross-site request forgery)跨站请求伪造,也被称为“One Click Atta ...

  7. 云计算---openstack创建虚拟机过程

     虚拟机创建过程: (1)界面或命令行通过RESTful API向keystone获取认证信息.(2)keystone通过用户请求认证信息,并生成auth-token返回给对应的认证请求.(3)界面或 ...

  8. python----print线程安全问题

    在Python2中print是非线程安全的,Python3中是安全的 https://www.jianshu.com/p/acdaf2ffd81b

  9. php中危险的木马函数-eval()函数

    eval() 函数可将字符串转换为代码执行,并返回一个或多个值. 如果eval函数在执行时遇到错误,则抛出异常给调用者. 类似的函数是loadcode ,loadcode并不立即执行代码,而是返回一个 ...

  10. [Angular 8] Calculate and Measure Performance budgets with the Angular CLI

    Measuring is extremely important, without numbers we don’t know about potential problems and we don’ ...