Leetcode-第151场周赛
1169.查询无效交易
题目描述
如果出现下述两种情况,交易 可能无效:
- 交易金额超过 ¥1000
- 或者,它和另一个城市中同名的另一笔交易相隔不超过 60 分钟(包含 60 分钟整)
每个交易字符串 transactions[i] 由一些用逗号分隔的值组成,这些值分别表示交易的名称,时间(以分钟计),金额以及城市。
给你一份交易清单 transactions,返回可能无效的交易列表。你可以按任何顺序返回答案。
示例 1:
| 1 | 输入:transactions = ["alice,20,800,mtv","alice,50,100,beijing"] | 
示例 2:
| 1 | 输入:transactions = ["alice,20,800,mtv","alice,50,1200,mtv"] | 
示例 3:
| 1 | 输入:transactions = ["alice,20,800,mtv","bob,50,1200,mtv"] | 
提示:
- transactions.length <= 1000
- 每笔交易 transactions[i]按"{name},{time},{amount},{city}"的格式进行记录
- 每个交易名称 {name}和城市{city}都由小写英文字母组成,长度在1到10之间
- 每个交易时间 {time}由一些数字组成,表示一个0到1000之间的整数
- 每笔交易金额 {amount}由一些数字组成,表示一个0到2000之间的整数
解法
1.将每个字符串切割存入到结构体中,同时记录在原字符串数组中的位置index
2.对结构体数组进行排序,先按名排序,名相同的按时间从小到大排序
3.
- 遍历结构体数组先判断下一位是否越界,没有越界找到后面第一个不在相同城市的交易,因为已经排好了序,我们可知,若这一位与当前位时间相差超过60min,则名称相同的必然后面都超过60min,若找到无效交易将当前位放入res结果数组,直接continue下一循环
- 若下一位超过60min,判断上一位是否越界,若没有越界找到前面第一个不在相同城市的交易,其他与找下一位类似
4.遍历完毕,返回结果数组
| 1 | class Solution { | 
1170.比较字符串最小字母出现频次
我们来定义一个函数 f(s),其中传入参数 s 是一个非空字符串;该函数的功能是统计 s  中(按字典序比较)最小字母的出现频次。
例如,若 s = "dcce",那么 f(s) = 2,因为最小的字母是 "c",它出现了 2 次。
现在,给你两个字符串数组待查表 queries 和词汇表 words,请你返回一个整数数组 answer 作为答案,其中每个 answer[i] 是满足 f(queries[i]) < f(W) 的词的数目,W 是词汇表 words 中的词。
示例 1:
| 1 | 输入:queries = ["cbd"], words = ["zaaaz"] | 
示例 2:
| 1 | 输入:queries = ["bbb","cc"], words = ["a","aa","aaa","aaaa"] | 
提示:
- 1 <= queries.length <= 2000
- 1 <= words.length <= 2000
- 1 <= queries[i].length, words[i].length <= 10
- queries[i][j],- words[i][j]都是小写英文字母
解法
思路很简单
1.定义两个数组q,w分别存放queries和words各个字符串对应的f函数的值
2.将w从小到大排序,遍历q,当q[i]<w[i]时,则w[i]后面的也大于q[i],也就得到了q[i]对应的结果数组的值
3.将q[i]的每项存起来,便得到了结果数组,返回
f函数的实现:
利用map,存字符串每个字母的出现次数
找到最小字母的出现次数,返回该值
| 1 | class Solution { | 
1171.从链表中删去总和为0的连续节点
给你一个链表的头节点 head,请你编写代码,反复删去链表中由 总和 值为 0 的连续节点组成的序列,直到不存在这样的序列为止。
删除完毕后,请你返回最终结果链表的头节点。
你可以返回任何满足题目要求的答案。
(注意,下面示例中的所有序列,都是对 ListNode 对象序列化的表示。)
示例 1:
| 1 | 输入:head = [1,2,-3,3,1] | 
示例 2:
| 1 | 输入:head = [1,2,3,-3,4] | 
示例 3:
| 1 | 输入:head = [1,2,3,-3,-2] | 
提示:
- 给你的链表中可能有 1到1000个节点。
- 对于链表中的每个节点,节点的值:-1000 <= node.val <= 1000.
解法
因为只有1000个节点,所以直接考虑暴力
思路:
1.将链表转换为数组,便于进行操作
2.两层循环,i遍历每一个点,能否和后面形成总和为0的连续节点,若能,跳出循环,记录j位置,从开始位置i到结束位置j每个点赋值为INT_MAX,i跳转到j,进行下一次循环
3.循环完毕,遍历数组,将不为INT_MAX的值依次放入新的链表中,返回新链表
| 1 | /** | 
1172.餐盘栈
我们把无限数量 ∞ 的栈排成一行,按从左到右的次序从 0 开始编号。每个栈的的最大容量 capacity 都相同。
实现一个叫「餐盘」的类 DinnerPlates:
- DinnerPlates(int capacity)- 给出栈的最大容量- capacity。
- void push(int val)- 将给出的正整数- val推入 从左往右第一个 没有满的栈。
- int pop()- 返回 从右往左第一个 非空栈顶部的值,并将其从栈中删除;如果所有的栈都是空的,请返回- -1。
- int popAtStack(int index)- 返回编号- index的栈顶部的值,并将其从栈中删除;如果编号- index的栈是空的,请返回- -1。
示例:
| 1 | 输入: | 
提示:
- 1 <= capacity <= 20000
- 1 <= val <= 20000
- 0 <= index <= 100000
- 最多会对 push,pop,和popAtStack进行200000次调用。
解法
模拟栈操作,注意数据量10W+
要记录下那些位置可放入数,不然会超时
| 1 | class DinnerPlates { |