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场周赛解题报告
周日的比赛的时候正在外面办事,没有参加.赛后看了下题目,几道题除了表面要考的内容,还是有些能发散扩展的地方. 做题目不是最终目的,通过做题发现知识盲区,去研究学习,才能不断提高. 理论和实际是有关系的 ...
随机推荐
- JSON--stringify() 和 JSON--parse() 方法
序列化:stringify()将JavaScript对象序列号为JSON字符串反序列化:parse()将JSON字符串解析为原生JavaScript值 序列化选项:JSON.stringify()除了 ...
- va_start可变参数函数
void va_start(va_list ap, last); //变参起始地址 type va_arg(va_list ap, type); //下一个参数的地址 void va_end(va_l ...
- iOS Touch Id 开发
Touch Id Touch Id是iPhone5S后加入的一项新的功能,也就是大家熟知的指纹识别技术.大家用得最多的可能是手机的解屏操作,不用在和以前一样输入手机的四位数密码进行验证.一方面不用担心 ...
- thefuck安装和使用(ubuntu)
系统环境(已测试可用): ubuntu 18.04 lts (server或desktop),ubuntu 19.04(server或desktop) sudo apt update sudo apt ...
- python中redis
一.简介 二.redis的安装和使用 三.python操作readis之安装和支持存储类型 四.python操作redis值普通链接 五.python操作redis值连接池 六.操作之String操作 ...
- 解密Redis持久化【翻译】
本文来自Redis的作者,他在论坛看到大家对Redis持久化误解较大,所以写此文章论述持久化 写操作的流程 首先我们来看一下数据库在进行写操作时到底做了哪些事,主要有下面五个过程. 客户端向服务端发送 ...
- Linux网络编程综合运用之MiniFtp实现(七)
上节中实现了配置文件的解析,这节来实现用户登录的验证,首先用客户端来登录vsftpd来演示登录的过程: 接着再连接miniftpd,来看下目前的效果: 接下来实现它,与协议相关的模块都是在ftppro ...
- P2661 信息传递[最小环+边带权并查集]
题目来源:洛谷 题目描述 有 n 个同学(编号为 1 到 n )正在玩一个信息传递的游戏.在游戏里每人都有一个固定的信息传递对象,其中,编号为 i 的同学的信息传递对象是编号为 Ti 的同学. 游戏 ...
- kafka读书笔记《kafka并不难学》
======第一章 1 在高并发场景,如大量插入.更新数据库会导致锁表,导致连接数过多的异常,此时需要消息队列来缓冲一下.消息队列通过异步处理请求来缓解压力 2 消息队列采用异步通信机制消息队列拥有先 ...
- Redis vs kafka
kafka的订阅可以重复消费,但redis的不行,只能收到订阅之后发布的数据 redis无法实现消息堆积和回溯 1 Redis是个数据库,可以改.查,而KFAKA 不能改查2 redis是内存数据库, ...