每日算法&面试题,大厂特训二十八天——第二十七天(函数)
Posted 肥学
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了每日算法&面试题,大厂特训二十八天——第二十七天(函数)相关的知识,希望对你有一定的参考价值。
目录标题
导读
肥友们为了更好的去帮助新同学适应算法和面试题,最近我们开始进行专项突击一步一步来。上一期我们完成了动态规划二十一天现在我们进行下一项对各类算法进行二十八天的一个小总结。还在等什么快来一起肥学进行二十八天挑战吧!!
特别介绍
📣小白练手专栏,适合刚入手的新人欢迎订阅编程小白进阶
📣python有趣练手项目里面包括了像《机器人尬聊》《恶搞程序》这样的有趣文章,可以让你快乐学python练手项目专栏
📣另外想学JavaWeb进厂的同学可以看看这个专栏:传送们
📣这是个冲刺大厂面试专栏还有算法比赛练习我们一起加油 上岸之路
目录:目录表
算法特训二十八天
给定一个 n 叉树的根节点 root ,返回 其节点值的 前序遍历 。
n 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。
输入:root = [1,null,3,2,4,null,5,6]
输出:[1,3,5,6,2,4]
示例 2:
输入:root = [1,null,2,3,4,5,null,null,6,7,null,8,null,9,10,null,null,11,null,12,null,13,null,null,14]
输出:[1,2,3,6,7,11,14,4,8,12,5,9,13,10]
解题思路:
初始化:
/*
// Definition for a Node.
class Node
public int val;
public List<Node> children;
public Node()
public Node(int _val)
val = _val;
public Node(int _val, List<Node> _children)
val = _val;
children = _children;
;
*/
题解:
class Solution
public List<Integer> preorder(Node root)
LinkedList<Integer> output = new LinkedList<>();
if (root == null)
return output;
LinkedList<Node> stack = new LinkedList<>();
stack.add(root);
while (!stack.isEmpty())
Node node = stack.pollLast();
output.add(node.val);
Collections.reverse(node.children);
for (Node item : node.children)
stack.add(item);
return output;
nums1 中数字 x 的 下一个更大元素 是指 x 在 nums2 中对应位置 右侧 的 第一个 比 x 大的元素。
给你两个 没有重复元素 的数组 nums1 和 nums2 ,下标从 0 开始计数,其中nums1 是 nums2 的子集。
对于每个 0 <= i < nums1.length ,找出满足 nums1[i] == nums2[j] 的下标 j ,并且在 nums2
确定 nums2[j] 的 下一个更大元素 。如果不存在下一个更大元素,那么本次查询的答案是 -1 。返回一个长度为 nums1.length 的数组 ans 作为答案,满足 ans[i] 是如上所述的 下一个更大元素 。
示例 1:
输入:nums1 = [4,1,2], nums2 = [1,3,4,2].
输出:[-1,3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:
- 4 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
- 1 ,用加粗斜体标识,nums2 = [1,3,4,2]。下一个更大元素是 3 。
- 2 ,用加粗斜体标识,nums2 = [1,3,4,2]。不存在下一个更大元素,所以答案是 -1 。
示例 2:
输入:nums1 = [2,4], nums2 = [1,2,3,4].
输出:[3,-1]
解释:nums1 中每个值的下一个更大元素如下所述:
- 2 ,用加粗斜体标识,nums2 = [1,2,3,4]。下一个更大元素是 3 。
- 4 ,用加粗斜体标识,nums2 = [1,2,3,4]。不存在下一个更大元素,所以答案是 -1 。
单调栈+哈希表
class Solution
public int[] nextGreaterElement(int[] nums1, int[] nums2)
Map<Integer, Integer> map = new HashMap<Integer, Integer>();
Deque<Integer> stack = new ArrayDeque<Integer>();
for (int i = nums2.length - 1; i >= 0; --i)
int num = nums2[i];
while (!stack.isEmpty() && num >= stack.peek())
stack.pop();
map.put(num, stack.isEmpty() ? -1 : stack.peek());
stack.push(num);
int[] res = new int[nums1.length];
for (int i = 0; i < nums1.length; ++i)
res[i] = map.get(nums1[i]);
return res;
面试题
什么时候用多线程、为什么要设计多线程?
高并发
系统接受实现多用户多请求的高并发时,通过多线程来实现。
线程后台处理大任务
一个程序是线性执行的。如果程序执行到要花大量时间处理的任务时,那主程序就得等待其执
行完才能继续执行下面的。那用户就不得不等待它执行完。
这时候可以开线程把花大量时间处理的任务放在线程处理,这样线程在后台处理时,主程序也
可以继续执行下去,用户就不需要等待。线程执行完后执行回调函数。
大任务
大任务处理起来比较耗时,这时候可以起到多个线程并行加快处理(例如:分片上传)。
好处:可以提高 CPU 的利用率。在多线程程序中,一个线程必须等待的时候,CPU 可以运
行其他的线程而不是等待,这样就大大提高了程序的效率。也就是说允许单个程序创建多个并
行执行的线程来完成各自的任务。
多线程越多效率越高吗?
不是
当线程总数较少时,线程越多,效率越高。
当线程总数较多时,由于线程本身调用耗时,线程越多,效率越低。
线程数越多会造成:
线程的生命周期开销非常高
点击直接资料领取
这里有python,Java学习资料还有有有趣好玩的编程项目,更有难寻的各种资源。反正看看也不亏。
以上是关于每日算法&面试题,大厂特训二十八天——第二十七天(函数)的主要内容,如果未能解决你的问题,请参考以下文章