LeetCode 第 151 场周赛
一、查询无效交易(LeetCode-1169)
1.1 题目描述
1.2 解题思路
根据,它和另一个城市中同名的另一笔交易相隔不超过 60 分钟(包含 60 分钟整)
得出
城市A和其他城市任何一笔交易,时间的绝对值要大于60分钟才有效,若小于60分钟,则当前交易和其他城市的交易均无效。
理解了这层意思,问题就基本解决了。如果想到所有交易按时间排序,就把问题想复杂了。
1.3 解题代码
public class Solution {
List<String> res = new ArrayList<>();
List<Transaction> list = new ArrayList<>();
class Transaction {
public String name;
public int time;
public int amount;
public String city;
public String origin;
}
public List<String> invalidTransactions(String[] transactions) {
//对所有交易按时间排序
for (String transaction : transactions) {
list.add(str2Transaction(transaction));
}
Map<String, List<Transaction>> map = new HashMap<>();
for (Transaction transaction : list) {
//交易金额超过 ¥1000 无效
if (transaction.amount > 1000) {
save(transaction.origin);
}
//它和另一个城市中同名的另一笔交易相隔不超过 60 分钟
// 可以理解为其他城市的所有同名交易)
List<Transaction> temp = map.get(transaction.name);
if (temp == null) {
map.put(transaction.name, new ArrayList<>());
} else {
for (Transaction a : temp) {
//比较是否是同一个城市
if (!transaction.city.equals(a.city) && Math.abs(transaction.time - a.time) <= 60) {
save(transaction.origin);
save(a.origin);
}
}
}
map.get(transaction.name).add(transaction);
}
return res;
}
//字符串转换为交易对象
private Transaction str2Transaction(String transaction) {
Transaction transaction1 = new Transaction();
String[] fields = transaction.split(",");
transaction1.name = fields[0];
transaction1.time = Integer.valueOf(fields[1]);
transaction1.amount = Integer.valueOf(fields[2]);
transaction1.city = fields[3];
transaction1.origin = transaction;
return transaction1;
}
//去重保存结果
private void save(String str) {
if (!res.contains(str)) {
res.add(str);
}
}
}
优化后的写法
public List<String> invalidTransactions(String[] transactions) {
List<String> res = new ArrayList<>();
if (transactions.length == 0) {
return res;
}
Map<String, List<Integer>> map = new HashMap<>();
int len = transactions.length;
//存放交易索引,用于去重处理
int[] resArray = new int[len];
for (int i = 0; i < len; i++) {
String[] field = transactions[i].split(",");
//交易金额超过 ¥1000 无效
if (Integer.valueOf(field[2]) > 1000) {
resArray[i] = 1;
}
//它和另一个城市中同名的另一笔交易相隔不超过 60 分钟
// 可以理解为其他城市的所有交易
if (map.get(field[0]) == null) {
map.put(field[0], new ArrayList<>());
} else {
for (int j : map.get(field[0])) {
String[] fieldTemp = transactions[j].split(",");
// 比较城市名称与相差的时间
if (!field[3].equals(fieldTemp[3]) && Math.abs(Integer.valueOf(field[1]) - Integer.valueOf(fieldTemp[1])) <= 60) {
resArray[i] = 1;
resArray[j] = 1;
}
}
}
map.get(field[0]).add(i);
}
for (int i = 0; i < len; i++) {
if(resArray[i] == 1){
res.add(transactions[i]);
}
}
return res;
}
二、比较字符串最小字母出现频次(LeetCode-1170)
三、从链表中删去总和值为零的连续节点(LeetCode-1171)
LeetCode 第 151 场周赛的更多相关文章
- LeetCode第151场周赛(Java)
这是我第一次写周赛的题目,而且还是虚拟的.从这次起,以后就将所有错过的题目都写到博客来.当然既然是我错的,那代码肯定不是我自己的.我会注明来源.并且我会自己敲一遍.多总结总是没坏处的. 另外比较糟糕的 ...
- LeetCode 第 165 场周赛
LeetCode 第 165 场周赛 5275. 找出井字棋的获胜者 5276. 不浪费原料的汉堡制作方案 5277. 统计全为 1 的正方形子矩阵 5278. 分割回文串 III C 暴力做的,只能 ...
- Leetcode第 217 场周赛(思维量比较大)
Leetcode第 217 场周赛 比赛链接:点这里 做完前两题我就知道今天的竞赛我已经结束了 这场比赛思维量还是比较大的. 1673. 找出最具竞争力的子序列 题目 给你一个整数数组 nums 和一 ...
- Leetcode 第133场周赛解题报告
今天参加了leetcode的周赛,算法比赛,要求速度比较快.有思路就立马启动,不会纠结是否有更好的方法或代码可读性.只要在算法复杂度数量级内,基本上是怎么实现快速就怎么来了. 比赛时先看的第二题,一看 ...
- LeetCode第152场周赛(Java)
这算是我第一次正式参加 LeetCode 的周赛吧.通过两道题.意料之中(通过上次模拟可以看出来).总的来说,脑袋还是不太灵光.想的有点慢.全球第一名 0:10:19 就全部通过...感觉我的智商被狠 ...
- Leetcode 第137场周赛解题报告
今天的比赛的题目相对来说比较「直白」,不像前几周都是一些特定的算法,如果你没学过不可能想出来. 做了这些周,对leetcode比赛的题目也发现了一些「规律」. 一般前两道题都很「简单」,只要有想法,直 ...
- LeetCode 第 150 场周赛
一.拼写单词(LeetCode-1160) 1.1 题目描述 1.2 解题思路 由于给定的chars,每个字母只能用一次,所以用大小为26的数组charsArray来表示a-z(例如charsArra ...
- LeetCode 第 196 场周赛 (题目:5452-5455,这是参加过最坑的周赛,暴力n^2居然可以过)
5452. 判断能否形成等差数列 给你一个数字数组 arr . 如果一个数列中,任意相邻两项的差总等于同一个常数,那么这个数列就称为 等差数列 . 如果可以重新排列数组形成等差数列,请返回 tru ...
- Leetcode 第136场周赛解题报告
周日的比赛的时候正在外面办事,没有参加.赛后看了下题目,几道题除了表面要考的内容,还是有些能发散扩展的地方. 做题目不是最终目的,通过做题发现知识盲区,去研究学习,才能不断提高. 理论和实际是有关系的 ...
随机推荐
- 【MySQL】数据库(分库分表)中间件对比
分区:对业务透明,分区只不过把存放数据的文件分成了许多小块,例如mysql中的一张表对应三个文件.MYD,MYI,frm. 根据一定的规则把数据文件(MYD)和索引文件(MYI)进行了分割,分区后的表 ...
- English-培训6-Do you like rap?
- stm32和sd卡
SD卡从容量上讲分两种:标准容量和大容量,最小的是标准容量,小于等于2G 其中的访问关系如下: SD卡分为两种模式:认证模式和传输模式,每一个模式包含着不同的状态,如下 以下主要讲其初始化过程: SD ...
- java判定数据(对象)类型
1.说明一 int 是关键字,Integer是包装类,Number是所有数字了的基类(父类).所以,Number是Integer的基础,Integer是int的基础,也称Integer是int的原型类 ...
- Ubuntu18.04开机启动sudo命令
首先接前文:ubuntu18.04 下启动Android Studio报错KVM is required to run this AVD. /dev/kvm device: permission de ...
- Linux系统用终端打开图片
一.现在开发多数使用的系统都是linux系统,但有的时候会遇到一些比较麻烦的小问题,比如:在某个文件夹中存入大量的图片时,想要查看某张图片的时候,当你使用图形化显示的时候,就会很卡,所以在这里我针对于 ...
- nn.Conv2d 参数及输入输出详解
Torch.nn.Conv2d(in_channels,out_channels,kernel_size,stride=1,padding=0,dilation=1,groups=1,bias=Tru ...
- 十年种树----小白的起点save
大家好,给大家介绍一下我自己.各平台通用ID:琴鬼白羊,男,一个24岁学习采矿工程的在读研究僧,一个24岁还在想学习计算机的小白. 非洲经济学家Dambisa Moyo在他的<dead aid& ...
- Linux网络编程综合运用之MiniFtp实现(三)
前面已经对FTP相关的一些概念有了基本的认识,接下来就要进入代码编写阶段了,也是非常兴奋的阶段,在开启这个它之前先对项目需求进行一个梳理,对其我们要实现的FTP服务器是一个什么样子. ftp命令列表 ...
- 设计模式之命令模式-JS
理解命令模式 假设有一个快餐店,而我是该餐厅的点餐服务员,那么我一天的工作应该是这样的:当某位客人点餐或者打来订餐电话后,我会把他的需求都写在清单上,然后交给厨房,客人不用关心是哪些厨师帮他炒菜.我们 ...