LeetCode18--文件夹操作日志搜集器和数据流中的第k大元素

今天把所有有关栈的简单题都给刷了,最后几道面试题和前面的是重复的,在这里就不载记述了。 

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();
        }
}

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值