今天把所有有关栈的简单题都给刷了,最后几道面试题和前面的是重复的,在这里就不载记述了。
1.文件夹操作日志搜集器
//每当用户执行变更文件夹操作时,LeetCode 文件系统都会保存一条日志记录。 // // 下面给出对变更操作的说明: // // // "../" :移动到当前文件夹的父文件夹。如果已经在主文件夹下,则 继续停留在当前文件夹 。 // "./" :继续停留在当前文件夹。 // "x/" :移动到名为 x 的子文件夹中。题目数据 保证总是存在文件夹 x 。 // // // 给你一个字符串列表 logs ,其中 logs[i] 是用户在 ith 步执行的操作。 // // 文件系统启动时位于主文件夹,然后执行 logs 中的操作。 // // 执行完所有变更文件夹操作后,请你找出 返回主文件夹所需的最小步数 。 // // // // 示例 1: // // // // 输入:logs = ["d1/","d2/","../","d21/","./"] //输出:2 //解释:执行 "../" 操作变更文件夹 2 次,即可回到主文件夹 // // // 示例 2: // // // // 输入:logs = ["d1/","d2/","./","d3/","../","d31/"] //输出:3 // // // 示例 3: // // 输入:logs = ["d1/","../","../","../"] //输出:0 // // // // // 提示: // // // 1 <= logs.length <= 103 // 2 <= logs[i].length <= 10 // logs[i] 包含小写英文字母,数字,'.' 和 '/' // logs[i] 符合语句中描述的格式 // 文件夹名称由小写英文字母和数字组成 // // Related Topics 栈
注意,判断字符串是否相等的时候采用equls,否则会报错。
public int minOperations(String[] logs) {
Deque<String> deque = new LinkedList<>();
for (int i = 0; i < logs.length; i++) {
if(logs[i].equals("../") && !deque.isEmpty()){
deque.pop();
}else if(logs[i].equals("./")){
}else if(logs[i].equals("../") && deque.isEmpty()){
}
else{
deque.push(logs[i]);
}
}
int k = 0;
while(!deque.isEmpty()){
deque.pop();
k++;
}
return k;
}
2.数据流中的第k大元素
//设计一个找到数据流中第 k 大元素的类(class)。注意是排序后的第 k 大元素,不是第 k 个不同的元素。 // // 请实现 KthLargest 类: // // // KthLargest(int k, int[] nums) 使用整数 k 和整数流 nums 初始化对象。 // int add(int val) 将 val 插入数据流 nums 后,返回当前数据流中第 k 大的元素。 // // // // // 示例: // // //输入: //["KthLargest", "add", "add", "add", "add", "add"] //[[3, [4, 5, 8, 2]], [3], [5], [10], [9], [4]] //输出: //[null, 4, 5, 5, 8, 8] // //解释: //KthLargest kthLargest = new KthLargest(3, [4, 5, 8, 2]); //kthLargest.add(3); // return 4 //kthLargest.add(5); // return 5 //kthLargest.add(10); // return 5 //kthLargest.add(9); // return 8 //kthLargest.add(4); // return 8 // // // //提示: // // // 1 <= k <= 104 // 0 <= nums.length <= 104 // -104 <= nums[i] <= 104 // -104 <= val <= 104 // 最多调用 add 方法 104 次 // 题目数据保证,在查找第 k 大元素时,数组中至少有 k 个元素 // // Related Topics 堆 设计
第一次接触到堆这种数据结构,题解中采用优先级队列PriorityQueue,大大简化了分析过程,直接将排序就交给了队列,我们只负责push和pop就行了。
class KthLargest {
//这里使用优先级队列是因为其优良的特性,可以以一定的方式排列队列中的元素
private PriorityQueue<Integer> queue;
private int limit;
public KthLargest(int k, int[] nums) {
limit = k;
queue = new PriorityQueue<>(k);
for (int num : nums) {
add(num);
}
}
public int add(int val) {
if (queue.size() < limit) {
queue.add(val);
//只要有大于queue.peek()的直接将其出队列,并把新的元素压入队列,排序交给优先级队列
} else if (val > queue.peek()) {
queue.poll();
queue.add(val);
}
return queue.peek();
}
}