获得徽章 18
- 本题中可能出现括号嵌套的情况,比如 2[a2[bc]],这种情况下我们可以先转化成 2[abcbc],在转化成 abcbcabcbc。我们可以把字母、数字和括号看成是独立的 TOKEN,并用栈来维护这些 TOKEN。具体的做法是,遍历这个栈:
如果当前的字符为数位,解析出一个数字(连续的多个数位)并进栈
如果当前的字符为字母或者左括号,直接进栈
如果当前的字符为右括号,开始出栈,一直到左括号出栈,出栈序列反转后拼接成一个字符串,此时取出栈顶的数字(此时栈顶一定是数字,想想为什么?),就是这个字符串应该出现的次数,我们根据这个次数和字符串构造出新的字符串并进栈
重复如上操作,最终将栈中的元素按照从栈底到栈顶的顺序拼接起来,就得到了答案。注意:这里可以用不定长数组来模拟栈操作,方便从栈底向栈顶遍历。展开评论点赞 - 题目给定一棵树 root,树的每个节点都有一个各不相同的值。并且给定一个数组 to_delete,包含需要删除的节点值。返回删除所有的to_delete 中的节点后,剩余的树的集合。
可以利用深度优先搜索来遍历每一个节点,定义函数 dfs,输入是参数是某个节点 node 和这个节点是否为潜在的新的根节点 is_root。函数中,首先判断这个节点是否要被删除,如果是,那么它的两个子节点(如果有的话)便成为了潜在的根节点。如果这个节点的值不在 to_delete 中并且 is_root 为 true,那么这个节点便成为了一个新的根节点,需要把它放入结果数组中。同时也要对它的两个子节点进行同样的操作。dfs 的返回值为更新后的 node。
对根节点调用一次 dfs,返回新的根节点数组即可。展开评论点赞 - 1点赞
- 首先使用哈希表记录数组元素出现的个数。接着定义一个[val,count] 按出现次数排序的最小堆PriorityQueue<int[]> minHeap = new PriorityQueue<>((a,b)->a[1]-b[1]); 遍历哈希表,堆size小于k时,直接添加进入。等于k的时候,则与peek()比较,当堆顶元素出现的次数小于k时,poll()将新的添加入堆。(不存在出现次数等于的两种数「题目数据保证答案唯一,换句话说,数组中前k个高频元素的集合是唯一的」)代码虽多,但是逻辑要清楚,才不会迷惑
code.juejin.cn
展开评论点赞