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 { |