【模拟】找到最接近0的数字
题目
给你一个长度为 n 的整数数组 nums ,请你返回 nums 中最 接近 0 的数字。如果有多个答案,请你返回它们中的 最大值 。
示例 1:
| |
示例 2:
| |
提示:
1 <= n <= 1000-105 <= nums[i] <= 10^5
解题思路
找绝对值最小的,若相同则选正数
代码
| |
【枚举】买钢笔和铅笔的方案数
题目
给你一个整数 total ,表示你拥有的总钱数。同时给你两个整数 cost1 和 cost2 ,分别表示一支钢笔和一支铅笔的价格。你可以花费你部分或者全部的钱,去买任意数目的两种笔。
请你返回购买钢笔和铅笔的 不同方案数目 。
示例 1:
| |
示例 2:
| |
提示:
1 <= total, cost1, cost2 <= 10^6
解题思路
先算出最多买钢笔的数量max1,那么钢笔可买范围为[0,max1]
然后再算出铅笔可买数量范围
代码
| |
【模拟】设计一个 ATM 机器
题目
一个 ATM 机器,存有 5 种面值的钞票:20 ,50 ,100 ,200 和 500 美元。初始时,ATM 机是空的。用户可以用它存或者取任意数目的钱。
取款时,机器会优先取 较大 数额的钱。
- 比方说,你想取
$300,并且机器里有2张$50的钞票,1张$100的钞票和1张$200的钞票,那么机器会取出$100和$200的钞票。 - 但是,如果你想取
$600,机器里有3张$200的钞票和1张$500的钞票,那么取款请求会被拒绝,因为机器会先取出$500的钞票,然后无法取出剩余的$100。注意,因为有$500钞票的存在,机器 不能 取$200的钞票。
请你实现 ATM 类:
ATM()初始化 ATM 对象。void deposit(int[] banknotesCount)分别存入$20,$50,$100,$200和$500钞票的数目。int[] withdraw(int amount)返回一个长度为5的数组,分别表示$20,$50,$100,$200和$500钞票的数目,并且更新 ATM 机里取款后钞票的剩余数量。如果无法取出指定数额的钱,请返回[-1](这种情况下 不 取出任何钞票)。
示例 1:
| |
提示:
banknotesCount.length == 50 <= banknotesCount[i] <= 10^91 <= amount <= 10^9- 总共 最多有
5000次withdraw和deposit的调用。 - 函数
withdraw和deposit至少各有 一次 调用。
解题思路
模拟即可
但这题的数据范围很搞啊
代码
| |
【枚举】节点序列的最大得分
题目
给你一个 n 个节点的 无向图 ,节点编号为 0 到 n - 1 。
给你一个下标从 0 开始的整数数组 scores ,其中 scores[i] 是第 i 个节点的分数。同时给你一个二维整数数组 edges ,其中 edges[i] = [ai, bi] ,表示节点 ai 和 bi 之间有一条 无向 边。
一个合法的节点序列如果满足以下条件,我们称它是 合法的 :
- 序列中每 相邻 节点之间有边相连。
- 序列中没有节点出现超过一次。
节点序列的分数定义为序列中节点分数之 和 。
请你返回一个长度为 4 的合法节点序列的最大分数。如果不存在这样的序列,请你返回 -1 。
示例 1:

| |
示例 2:

| |
提示:
n == scores.length4 <= n <= 5 * 10^41 <= scores[i] <= 10^80 <= edges.length <= 5 * 10^4edges[i].length == 20 <= ai, bi <= n - 1ai != bi- 不会有重边。
解题思路
思路很有意思
要找一个长度为4的链,可以先枚举中间的2个节点u和v(链中间的那条边)。为了让链的点权值之和最大,那么剩下的两个点应该选择与u相邻的,排除v以外权值最大的点a , 以及与v相邻的,排除u以外权值最大的点b。
注意特殊情况:点a和点b不能是同一个点,所以需要找出与u相邻的最大的3个点。
代码
| |
