【LeetCode】挑战100天 Day10(热题+面试经典150题)
- 一、LeetCode介绍
- 二、LeetCode 热题 HOT 100-12
- 2.1 题目
- 2.2 题解
- 三、面试经典 150 题-12
- 3.1 题目
- 3.2 题解
一、LeetCode介绍
LeetCode是一个在线编程网站,提供各种算法和数据结构的题目,面向程序员、计算机科学专业学生和技术爱好者等人群,旨在帮助他们提高算法和编程技能。LeetCode上的问题通常来自各种技术公司的面试题目,因此它也是程序员面试准备的重要资源之一。
LeetCode上的问题涵盖了各种难度级别,从入门级到专家级都有不同难度的题目可供练习。用户可以选择使用不同的编程语言提交答案,LeetCode能够对结果进行评估并返回测试结果。
除了题目外,LeetCode还提供了讨论区、排行榜等社区功能,用户可以在这里交流学习心得、解决疑难问题,并与其他用户比较自己的做题成绩。
挑战100天 AI In LeetCode是基于LeetCode题库,借助AI的能力进行解题、并学习其解题过程。
二、LeetCode 热题 HOT 100-12
2.1 题目
整数转罗马数字
罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。字符 数值
I 1
V 5
X 10
L 50
C 100
D 500
M 1000
例如, 罗马数字 2 写做 II ,即为两个并列的 1。12 写做 XII ,即为 X + II 。 27 写做 XXVII, 即为 XX + V + II 。通常情况下,罗马数字中小的数字在大的数字的右边。但也存在特例,例如 4 不写做 IIII,而是 IV。数字 1 在数字 5 的左边,所表示的数等于大数 5 减小数 1 得到的数值 4 。同样地,数字 9 表示为 IX。这个特殊的规则只适用于以下六种情况:I 可以放在 V (5) 和 X (10) 的左边,来表示 4 和 9。
X 可以放在 L (50) 和 C (100) 的左边,来表示 40 和 90。
C 可以放在 D (500) 和 M (1000) 的左边,来表示 400 和 900。
给你一个整数,将其转为罗马数字。示例 1:输入: num = 3
输出: "III"
示例 2:输入: num = 4
输出: "IV"
示例 3:输入: num = 9
输出: "IX"
示例 4:输入: num = 58
输出: "LVIII"
解释: L = 50, V = 5, III = 3.
示例 5:输入: num = 1994
输出: "MCMXCIV"
解释: M = 1000, CM = 900, XC = 90, IV = 4.提示:1 <= num <= 3999
2.2 题解
解题思路:
- 构建两个数组,一个存储数值,一个存储对应的罗马字符。
- 遍历数值数组,依次比较当前值与 num 的大小关系,如果当前值小于等于 num,则将对应的罗马字符追加到结果中,并将 num 减去当前值;否则继续遍历下一个数值。
- 重复上述过程直到 num 变为 0。
这种解法的关键在于利用贪心算法,每次尽量选择最大的符号作为组合,直到 num 变为 0。
public String intToRoman(int num) {int[] values = {1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};String[] symbols = {"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};StringBuilder roman = new StringBuilder();int i = 0;while (num > 0) {if (num - values[i] >= 0) {roman.append(symbols[i]);num -= values[i];} else {i++;}}return roman.toString();}
三、面试经典 150 题-12
数组 / 字符串
3.1 题目
O(1) 时间插入、删除和获取随机元素
实现RandomizedSet 类:RandomizedSet() 初始化 RandomizedSet 对象
bool insert(int val) 当元素 val 不存在时,向集合中插入该项,并返回 true ;否则,返回 false 。
bool remove(int val) 当元素 val 存在时,从集合中移除该项,并返回 true ;否则,返回 false 。
int getRandom() 随机返回现有集合中的一项(测试用例保证调用此方法时集合中至少存在一个元素)。每个元素应该有 相同的概率 被返回。
你必须实现类的所有函数,并满足每个函数的 平均 时间复杂度为 O(1) 。示例:输入
["RandomizedSet", "insert", "remove", "insert", "getRandom", "remove", "insert", "getRandom"]
[[], [1], [2], [2], [], [1], [2], []]
输出
[null, true, false, true, 2, true, false, 2]解释
RandomizedSet randomizedSet = new RandomizedSet();
randomizedSet.insert(1); // 向集合中插入 1 。返回 true 表示 1 被成功地插入。
randomizedSet.remove(2); // 返回 false ,表示集合中不存在 2 。
randomizedSet.insert(2); // 向集合中插入 2 。返回 true 。集合现在包含 [1,2] 。
randomizedSet.getRandom(); // getRandom 应随机返回 1 或 2 。
randomizedSet.remove(1); // 从集合中移除 1 ,返回 true 。集合现在包含 [2] 。
randomizedSet.insert(2); // 2 已在集合中,所以返回 false 。
randomizedSet.getRandom(); // 由于 2 是集合中唯一的数字,getRandom 总是返回 2 。提示:-231 <= val <= 231 - 1
最多调用 insert、remove 和 getRandom 函数 2 * 105 次
在调用 getRandom 方法时,数据结构中 至少存在一个 元素。
3.2 题解
解题思路:
- 使用一个 List 存储集合中的元素,使用一个 Map 来存储元素到索引的映射。
- 插入元素时,判断 Map 中是否已存在该元素,如果不存在,则将元素插入到 List 的末尾,并在 Map 中记录该元素对应的索引。
- 删除元素时,先判断 Map 中是否存在该元素,如果存在,将要删除的元素与 List 最后一个元素交换位置,然后删除 List 的最后一个元素,并更新 Map 中最后一个元素的索引,最后移除 Map 中要删除的元素。
- 获取随机元素时,生成一个随机索引,然后返回 List 中对应索引的元素。
这种实现方式能够满足平均时间复杂度为 O(1) 的要求,因为 List 和 Map 的插入、删除和查找操作的平均时间复杂度都为 O(1)。
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;public class RandomizedSet {private List<Integer> list;private Map<Integer, Integer> map;private Random random;public RandomizedSet() {list = new ArrayList<>();map = new HashMap<>();random = new Random();}public boolean insert(int val) {if (map.containsKey(val)) {return false;}list.add(val);map.put(val, list.size() - 1);return true;}public boolean remove(int val) {if (!map.containsKey(val)) {return false;}int index = map.get(val);int lastVal = list.get(list.size() - 1);list.set(index, lastVal);list.remove(list.size() - 1);map.put(lastVal, index);map.remove(val);return true;}public int getRandom() {int randomIndex = random.nextInt(list.size());return list.get(randomIndex);}
}
至此,挑战100天 AI In LeetCode Day10(热题+面试经典150题)完成,后续会持续调整;查阅过程中若遇到问题欢迎留言或私信交流。