写点什么

Java 一套拳法刷掉 n 个遍历树的问题 John 易筋 ARTS 打卡 Week 43

用户头像
John(易筋)
关注
发布于: 2021 年 04 月 02 日

1. Algorithm: 每周至少做一个 LeetCode 的算法题

笔者的文章:


算法:258. Add Digits 各位相加

题目

258. Add Digits


Given an integer num, repeatedly add all its digits until the result has only one digit, and return it.


Example 1:


Input: num = 38Output: 2Explanation: The process is38 --> 3 + 8 --> 1111 --> 1 + 1 --> 2 Since 2 has only one digit, return it.
复制代码


Example 2:


Input: num = 0Output: 0
复制代码


Constraints:


0 <= num <= 2^31 - 1
复制代码


Follow up: Could you do it without any loop/recursion in O(1) runtime?

递归解法

/* * @lc app=leetcode.cn id=258 lang=java * * [258] 各位相加 */
// @lc code=startclass Solution { public int addDigits(int num) { return (num < 10) ? num : addDigits(num / 10 + num % 10); }}// @lc code=end
复制代码

线性解法 O(1)时间复杂度

public class Solution {    public int addDigits(int num) {        if (num == 0){            return 0;        }        if (num % 9 == 0){            return 9;        }        else {            return num % 9;        }    }}
复制代码


我将尝试解释其背后的数学原理:


首先,您应该了解:


10^k % 9 = 1a*10^k % 9 = a % 9 
复制代码


然后让我们用一个例子来帮助解释。


说一个数字x = 23456
x = 2 * 10000 + 3 * 1000 + 4 * 100 + 5 * 10 + 6
2 * 10000%9 = 2%9
3 * 1000%9 = 3%9
4 * 100%9 = 4%9
5 * 10%9 = 5%9
复制代码


然后x%9 =(2+ 3 + 4 + 5 + 6)%9,请注意x = 2 * 10000 + 3 * 1000 + 4 * 100 + 5 * 10 + 6


所以我们有23456%9 =(2 + 3 + 4 + 5 + 6)%9


2. Review: 阅读并点评至少一篇英文技术文章笔者的文章:

笔者文章:

翻译:数据科学简历中的7个必备条件


管理Riskified的数据科学部门需要大量招聘-我们已经增加了一倍以上我ñ不到一年的时间,和半。作为几个职位的招聘经理,我还阅读了很多简历。招聘人员可在7.4秒内通过简历进行筛选,并且在招聘了几年之后,我的平均时间相当快,但还不是那么极端。在此博客中,我将引导您完成个人启发式搜索(“作弊”),以帮助我筛选简历。虽然我不能保证其他人使用相同的启发式方法,并且每个角色在重要性上的不同角色也会有所不同,但是注意这些要点可以帮助您克服 CV 筛选阶段。此外,其中一些启发式方法可能看起来不公平,或者可能会忽略合格的候选人。我同意不投资简历的有才华的机器学习从业者可能会被此屏幕拒绝,但这是考虑时间的最佳折衷方案。请记住,一个备受追捧的职位可能会吸引一百或更多的简历。如果您想要一个高效的过程,则简历屏幕必须快速。以下是用于快速筛选数据科学简历的 7 种启发式方法:

1.之前作为数据科学家的经验

我将快速浏览您的简历,以查看您以前的职位,并查看标记为“数据科学家”的职位。还有其他一些相邻的术语(取决于我要聘用的职位),例如“机器学习工程师”,“研究科学家”或“算法工程师”。我不将“ Data Analyst”包含在此类别中,因为日常工作通常与 Data Scientist 的工作不同,并且 Data Analyst 头衔是一个极为宽泛的术语。如果您在目前的工作中从事数据科学工作,并且还有其他创造性的工作描述,那么将自己的头衔更改为数据科学家可能是您的最大利益。对于实际上是数据科学家的数据分析师来说,这可能是非常正确的。请记住,即使 CV 包含您所从事的项目的描述(并且包括机器学习),但 Data Scientist 以外的标题也会增加不必要的歧义。此外,如果您曾在该领域接受过数据科学训练营或全职硕士课程,则这可能会被视为您数据科学经验的开始(除非您之前曾担任过类似的角色,否则将在以后阶段提出问题) )。

2.以业务为导向的成就

理想情况下,我想阅读您的工作(技术方面)以及业务成果。缺乏能够以业务术语进行交流的精通技术的数据科学家。如果您可以共享您的工作所影响的业务 KPI,那在我的书中会大为赞赏。例如,表明您的模型在 AUC 方面的改进是可以的,但是解决因模型改进而带来的转换率提高意味着您“得到了”-最终,业务影响才是真正重要的。比较以下以相同的重点(技术性还是商业性)描述相同工作的替代方案:一个。银行贷款违约率模型-将模型的精确召回 AUC 从 0.94 改进到 0.96。b。银行贷款违约率模型-在保持恒定违约率的同时,将业务部门的年收入提高了 3%(每年 50 万美元)。

3.教育

您的正规教育是什么,在哪个领域。它是知名机构吗?对于较新的应届毕业生,我还将研究他们的 GPA 以及他们是否获得过任何卓越奖或荣誉,例如进入 Rector 或 Dean 的榜单。由于数据科学是一个广阔的领域,没有任何标准化的测试或必需的知识,因此人们可以采用各种方法进入该领域。在上一个博客中,我描述了进入该领域的3条主要途径,并根据您的教育程度和时间安排,确定您可能选择了哪一条。因此,时间安排有助于理解您的故事-您如何以及何时过渡到数据科学。如果您没有任何数据科学方面的正规教育,那很好,但是您需要展示该领域的工作记录和/或相似领域的高级学位。

4.布局/视觉吸引力

我看过一些漂亮的简历(为个人灵感而保存了其中的一些),但我还收到了缺少任何格式的文本文件(.txt)。从事简历工作可能会很痛苦,如果您选择数据科学作为自己的工作,那么很有可能您不喜欢在业余时间创建美学设计。无需过度投入,您确实想要寻找一个不错的模板,该模板使您能够在有限的空间内获得所有信息。明智地使用空间-拆分页面并突出显示不属于按时间顺序进行的工作/教育的特定部分很有用。这可以包括您熟悉的技术堆栈,自我项目列表,到 github 或博客的链接以及其他。一些简单的图标也可以帮助强调节标题。许多候选人在他们熟悉的每种语言/工具旁边使用 1-5 个星号或条形图。就个人而言,出于以下几个原因,我不是这种方法的忠实支持者:


  • 这是非常主观的-您的“ 5 星”是否与其他人的“ 2 星”相同?

  • 他们将语言与工具混合在一起,在最坏的情况下,他们将其与软技能结合在一起-说您在“领导力”课程中的“ 4.5 星”没有帮助。作为坚强的成长心态的信奉者,声称要最大限度地发挥技能(尤其是难以量化和难以掌握软技能)感到非常自负。


我还通过采取主观措施并将其转换为饼图(30%python,10%团队合作者等),进一步看到了这种方法的滥用。尽管这可能被认为是一种脱颖而出的创新方法,但它表明在不同图表的概念背后缺乏基本的了解。


这是我在视觉上吸引人的简历的两个示例,细节因匿名而模糊不清。


信用 Eva Mishor![在这里插入图片描述](https://img-blog.csdnimg.cn/20210402235416647.png#pic_center =450x)视觉化的数据科学家简历,细节模糊。请注意,两个示例中使用的垂直拆分是用来区分经验,技能,成就和出版物的。在这两种情况下,简短的摘要段落都有助于描述他们的背景和愿望。经所有者许可后使用。


![在这里插入图片描述](https://img-blog.csdnimg.cn/20210402235431957.png#pic_center =450x)

5.机器学习的多样性

我寻找两种类型的品种:


  1. 算法类型-结构化/经典 ML 与深度学习。一些候选人仅与深度学习合作,包括可能更适合基于树的模型的结构化数据。虽然成为 DL 专家本身没有任何问题,但限制工具集可能会限制您的解决方案。正如马斯洛所说:“如果您仅有的工具是锤子,那么您往往会把所有问题都看作钉子。” 在Riskified中,我们处理结构化,领域驱动,功能工程化的数据,最好用各种形式的增强树来处理。有人的整个简历都指向 DL,这是一个问题。

  2. ML 领域-这通常与需要大量专业知识的两个领域相关-计算机视觉和 NLP。这些领域的专家需求旺盛,在许多情况下,他们的整个职业都将专注于这些领域。虽然这对于要寻找某人从事该领域的工作至关重要,但通常不适合某人担任更一般的数据科学职位。因此,如果您的大部分经验是在 NLP 上,并且您正在申请域外的职位,请尝试强调职位/项目,因为您正在处理结构化数据以证明多样性。

6.技术栈

通常可以将其分解为语言,特定的程序包(scikit 学习,pandas,dplyr 等),云及其服务(AWS,Azure,GCP)或其他工具。一些候选人将其与他们熟悉的算法或体系结构(RNN,XGBoost,K-NN)混合在一起。就个人而言,我更喜欢围绕技术和工具展开的工作。当提到特定算法时,我想知道候选人的理论 ML 知识是否仅限于那些特定算法。


在这里,我正在寻找技术堆栈的相关性-它们是否来自最近几年(这是应聘者亲身实践并学习新技能的积极信号),堆栈的广度(它们是否仅限于特定领域?工具,或者他们熟悉很多东西)以及与我们的堆栈相适应(我们需要教多少)。

7.项目

您有可以在 GitHub 上共享的东西吗?任何 Kaggle 竞赛或附带项目都可能会非常有帮助,使您可以查看简洁的代码,预处理的类型,功能工程,EDA,算法的选择以及现实项目中需要解决的无数其他问题。将链接添加到您的 GitHub 和 Kaggle 帐户,以供访问员深入研究您的代码。如果您没有太多经验,很有可能会询问您有关这些项目中的一个或多个的信息。在我进行的一些采访中,候选人对这个项目不太记得,我们也无法就他们所做的选择及其背后的原因展开对话。确保重新完成所做的工作或将其排除在简历之外。同样,请确保您展示了自己的最佳作品,并且已经投入了足够的时间和精力。最好有 2–3 个高质量项目,而不是 8–10 个中等(或更低)质量的项目。

概括

如果您正在寻找新的数据科学职位,请花一些时间并仔细阅读本文中的要点。如果您无法勾选所有这些标记,那就很好,但是越多越好。希望这些技巧将帮助您从人群中脱颖而出,并以鲜艳的色彩通过 CV 屏幕。


#pic_center =450x

参考

https://towardsdatascience.com/7-must-haves-in-your-data-science-cv-9316841aeb78


3. Tips: 学习至少一个技术技巧


笔者的文章:

Java一套拳法刷掉n个遍历树的问题


我不害怕曾經練過一萬種踢法的人,但我害怕一種踢法練過一萬次的人(by 叶师傅的徒弟 Bruce Lee)![在这里插入图片描述](https://img-blog.csdnimg.cn/20210401234308615.png#pic_center =500x)

树的遍历(Traversal)

如下图, 三种遍历方式, 可用同一种递归思想实现![在这里插入图片描述](https://img-blog.csdnimg.cn/202104012343262.png#pic_center =500x)

1. 144. 先序遍历(PreOrder, 按照先访问根节点的顺序)

示例 1:  1    \     2    /  3   
输入:root = [1,null,2,3]输出:[1,2,3]
复制代码


解法


/* * @lc app=leetcode.cn id=144 lang=java * * [144] 二叉树的前序遍历 */
// @lc code=start/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */class Solution { public List<Integer> preorderTraversal(TreeNode root) { List<Integer> list = new ArrayList<>(); dfs(root, list); return list; }
private void dfs(TreeNode root, List<Integer> list) { if (root == null) return; list.add(root.val); dfs(root.left, list); dfs(root.right, list); }}// @lc code=end
复制代码

2. 94 中序遍历(InOrder, 按照根节点在中间访问的顺序)

给定一个二叉树的根节点 root ,返回它的 中序 遍历。


示例:  1    \     2    /  3   
输入:root = [1,null,2,3]输出:[1,3,2]
复制代码


解法


class Solution {    public List<Integer> inorderTraversal(TreeNode root) {        List<Integer> list = new ArrayList<>();        dfs(root, list);
return list; }
private void dfs(TreeNode root, List<Integer> list) { if (root == null) return; dfs(root.left, list); list.add(root.val); dfs(root.right, list); }}
复制代码

3. 145 后续遍历(PosterOrder, 按照根节点在后面访问的顺序)

示例:
输入: [1,null,2,3] 1 \ 2 / 3
输出: [3,2,1]
复制代码


解法


class Solution {    public List<Integer> postorderTraversal(TreeNode root) {        List<Integer> list = new ArrayList<>();        dfs(root, list);        return list;    }
private void dfs(TreeNode root, List<Integer> list) { if (root == null) return; dfs(root.left, list); dfs(root.right, list); list.add(root.val); }}
复制代码

4. 100. 相同的树

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。


如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。![在这里插入图片描述](https://img-blog.csdnimg.cn/2021040217044554.png#pic_center =500x)


输入:p = [1,2,3], q = [1,2,3]输出:true
复制代码


解法


class Solution {    public boolean isSameTree(TreeNode p, TreeNode q) {        if ((p == null && q != null) || (p != null && q == null)) return false;        if (p == null && q == null) return true;        return p.val == q.val && isSameTree(p.left, q.left) && isSameTree(p.right, q.right);    }}
复制代码

5. 226 翻转二叉树

翻转一棵二叉树。



示例:
输入:
4 / \ 2 7 / \ / \1 3 6 9输出:
4 / \ 7 2 / \ / \9 6 3 1
复制代码


备注:这个问题是受到 Max Howell 的 原问题 启发的 :


谷歌:我们 90%的工程师使用您编写的软件(Homebrew),但是您却无法在面试时在白板上写出翻转二叉树这道题,这太糟糕了。![在这里插入图片描述](https://img-blog.csdnimg.cn/20210402171549153.png#pic_center =500x)


class Solution {    public TreeNode invertTree(TreeNode root) {        if (root == null) return root;        TreeNode left = root.left;        TreeNode right = root.right;        root.left = invertTree(right);        root.right = invertTree(left);        return    }}
复制代码

6. 590. N 叉树的后序遍历

给定一个 N 叉树,返回其节点值的 后序遍历 。


N 叉树 在输入中按层序遍历进行序列化表示,每组子节点由空值 null 分隔(请参见示例)。


进阶:


递归法很简单,你可以使用迭代法完成此题吗?


示例 1:![在这里插入图片描述](https://img-blog.csdnimg.cn/20210402172655789.png#pic_center =400x)


输入:root = [1,null,3,2,4,null,5,6]输出:[5,6,3,2,4,1]
复制代码


解法


/* * @lc app=leetcode.cn id=590 lang=java * * [590] N 叉树的后序遍历 */
// @lc code=start/*// 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> postorder(Node root) { List<Integer> list = new ArrayList<>(); dfs(root, list);
return list; }
private void dfs(Node root, List<Integer> list) { if (root == null) return; for(Node node: root.children) { dfs(node, list); } list.add(root.val); }}// @lc code=end
复制代码

7. 103. 二叉树的锯齿形层序遍历

给定一个二叉树,返回其节点值的锯齿形层序遍历。(即先从左往右,再从右往左进行下一层遍历,以此类推,层与层之间交替进行)。


例如:


给定二叉树 [3,9,20,null,null,15,7],
3 / \ 9 20 / \ 15 7返回锯齿形层序遍历如下:
[ [3], [20,9], [15,7]]
复制代码


解法:


/* * @lc app=leetcode.cn id=103 lang=java * * [103] 二叉树的锯齿形层序遍历 */
// @lc code=start/** * Definition for a binary tree node. * public class TreeNode { * int val; * TreeNode left; * TreeNode right; * TreeNode() {} * TreeNode(int val) { this.val = val; } * TreeNode(int val, TreeNode left, TreeNode right) { * this.val = val; * this.left = left; * this.right = right; * } * } */class Solution { public List<List<Integer>> zigzagLevelOrder(TreeNode root) { List<List<Integer>> result = new ArrayList<>(); if (root == null) { return result; } boolean isLeftToRight = true; Queue<TreeNode> queue = new LinkedList<>(); queue.offer(root); while (!queue.isEmpty()) { Deque<Integer> levelDeque = new LinkedList<>(); int size = queue.size(); for (int i = 0; i < size; i++) { TreeNode node = queue.poll(); if (isLeftToRight) { levelDeque.offerLast(node.val); } else { levelDeque.offerFirst(node.val); } if (node.left != null) queue.offer(node.left); if (node.right != null) queue.offer(node.right); }
result.add(new LinkedList<Integer>(levelDeque)); isLeftToRight = !isLeftToRight; }
return result; }}// @lc code=end
复制代码

8. 230. 二叉搜索树中第K小的元素

给定一个二叉搜索树的根节点 root ,和一个整数 k ,请你设计一个算法查找其中第 k 个最小元素(从 1 开始计数)。


示例 1:      3     / \    1   4     \      2  输入:root = [3,1,4,null,2], k = 1输出:1
复制代码


中序遍历


class Solution {    public int kthSmallest(TreeNode root, int k) {        List<Integer> list = new ArrayList<>();        dfs(root, k, list);
return list.get(k - 1); }
private void dfs(TreeNode root, int k, List<Integer> list) { if (root == null || list.size() == k) return; dfs(root.left, k, list); list.add(root.val); dfs(root.right, k, list); }}
复制代码

9. 102. 二叉树的层序遍历

给你一个二叉树,请你返回其按 层序遍历 得到的节点值。 (即逐层地,从左到右访问所有节点)。


示例:二叉树:[3,9,20,null,null,15,7],
3 / \ 9 20 / \ 15 7返回其层序遍历结果:
[ [3], [9,20], [15,7]]
复制代码


递归 + 前序遍历的解法,记录每一层的高度值。


class Solution {    public List<List<Integer>> levelOrder(TreeNode root) {        List<List<Integer>> result = new ArrayList<>();        dfs(root, 0, result);
return result; }
private void dfs(TreeNode root, int level, List<List<Integer>> result) { if (root == null) return; if (result.size() == level) { result.add(new ArrayList<Integer>()); } result.get(level).add(root.val); dfs(root.left, level + 1, result); dfs(root.right, level + 1, result); }}
复制代码

10. 199. 二叉树的右视图

给定一棵二叉树,想象自己站在它的右侧,按照从顶部到底部的顺序,返回从右侧所能看到的节点值。


示例:


输入: [1,2,3,null,5,null,4]输出: [1, 3, 4]解释:
1 <--- / \2 3 <--- \ \ 5 4 <---
复制代码


基本思路: 先序遍历, 记录每一层深度下的节点的值, 并先记录左节点再记录右节点, 则最后记录的值即为该层深度的右视图看到的值


class Solution {    public List<Integer> rightSideView(TreeNode root) {        List<List<Integer>> allList = new ArrayList<>();        List<Integer> list = new ArrayList<>();        if (root == null) return list;        dfs(root, 0, allList);
for (int i = 0; i < allList.size(); i++) { list.add(allList.get(i).get(allList.get(i).size() - 1)); }
return list; }
private void dfs(TreeNode root, int level, List<List<Integer>> allList) { if (root == null) return; if (level == allList.size()) allList.add(new ArrayList<Integer>()); allList.get(level).add(root.val); dfs(root.left, level + 1, allList); dfs(root.right, level + 1, allList); }}
复制代码

11. 104. 二叉树的最大深度

给定一个二叉树,找出其最大深度。


二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。


说明: 叶子节点是指没有子节点的节点。


示例:


给定二叉树 [3,9,20,null,null,15,7],
3 / \ 9 20 / \ 15 7
复制代码


返回它的最大深度 3 。


class Solution {    public int maxDepth(TreeNode root) {        return root == null ? 0 : 1 + Math.max(maxDepth(root.left), maxDepth(root.right));    }}
复制代码

12. 107. 二叉树的层序遍历 II

给定一个二叉树,返回其节点值自底向上的层序遍历。 (即按从叶子节点所在层到根节点所在的层,逐层从左向右遍历)


例如:给定二叉树 [3,9,20,null,null,15,7],


    3   / \  9  20    /  \   15   7
复制代码


返回其自底向上的层序遍历为:


[  [15,7],  [9,20],  [3]]
复制代码


class Solution {    public List<List<Integer>> levelOrderBottom(TreeNode root) {        List<List<Integer>> reverse = new ArrayList<>();        dfs(root, 0, reverse);        List<List<Integer>> result = new ArrayList<>();        for (List<Integer> list: reverse) {            result.add(0, list);        }
return result; }
private void dfs(TreeNode root, int level, List<List<Integer>> result) { if (root == null) return; if (result.size() == level) result.add(new ArrayList<Integer>()); result.get(level).add(root.val); dfs(root.left, level + 1, result); dfs(root.right, level + 1, result); }}
复制代码

参考

https://leetcode-cn.com/problems/n-ary-tree-preorder-traversal/solution/yi-tao-quan-fa-shua-diao-nge-bian-li-shu-de-wen--3/


4. Share: 分享一篇有观点和思考的技术文章笔者的文章:


极客大学产品经理训练营:数据分析与用户数据 第17课总结

讲师:邱岳

1. 用户属性

1.1 用户是谁

  • 通用:年龄、性别、地区、终端、分辨率、网络条件......

  • 业务:社交、来源、职业、家庭关系、学历、ID.....

  • 来自数据工具/用户调研/业务数据表

  • 快速辅助决策

  • 应指向用户画像

  • 形成对用户好恶的感性直觉理解

1.2 用户从哪里来,到哪里去

  • 互联网产品分析中最重要的分析领域;

  • 宏观分析和局部观察两种

  • 数据获取:用户行为日志

  • 常用工具:漏斗/地图

  • 思路:从微观轨迹到宏观数据

  • 从用户的角度看产品,标记在每一时刻可能做什么,去哪里

  • 核心路径是什么?路径的核心环节是什么?

2 App Store 页面体验

![在这里插入图片描述](https://img-blog.csdnimg.cn/20210324220037321.png#pic_center =300x)


  • 页面:☞ Portal: 今日推荐、游戏、App、搜索☞ List:应用列表☞ Detail:专文推荐、应用详情

  • 动作 分享、获取(点击获取 > 确认)、退出


![在这里插入图片描述](https://img-blog.csdnimg.cn/20210324215146179.png#pic_center =600x)![在这里插入图片描述](https://img-blog.csdnimg.cn/20210324215212114.png#pic_center =500x)来源 --> 着陆位置 --> 行为轨迹 --> 关键行为 --> 出口 --> 引荐 | 留存

2.1 用户分类与用户标签

  • 用户是谁 x 用户做了什么 --> 用户标签

  • 新用户 & 老用户

  • 高频用户 & 低频用户

  • 浏览用户 & 下载用户

  • 免费用户 * 付费用户

  • 新购用户 & 复购用户

  • 无支付路径用户 & 支付宝用户 & 银行卡用户

  • 生产力工具用户 & 游戏用户 & 创造力工具用户

  • 生产用户 & 消费用户

  • L1, L2, L3, L4

2.2 用户产品的数据模型

  • 假设一个关键目标:提高 App 下载量

  • 以终为始,倒推实现路径![在这里插入图片描述](https://img-blog.csdnimg.cn/20210324215937532.png#pic_center =600x)![在这里插入图片描述](https://img-blog.csdnimg.cn/20210324220458333.png#pic_center =600x)

2.3 基于数据反推的策略

  • 针对 App Store 新用户提供搜索引导☞ 目标:提高新用户进入搜索页 -- 输入搜索词 -- 提交搜索 -- 浏览并点击搜索结果的比例

  • 针对低频用户发送 Push,直接导入搜索结果页☞ 目标:提高低频用户进入搜索页 -- 浏览并点击 -- 自行输入搜索词的比例

  • 针对免费用户,优先展示免费 App 的搜索结果页☞ 目标:提高免费用户的搜索列表至应用详情的转化率

  • 还有很多,当我们将框架搭建好后,数据填充其间,就可以集中考虑策略了。

3 作业

  • 挑选一个你喜欢的产品(结构简单一点),做一个用户路径地图

  • 针对这个路径地图,做一个漏斗模型,填入你认为合理的数字

  • (选做)根据这个你假设的数字,提出下一步的优化重点

  • (选做)针对优化重点,提出一到两个改进方案。

发布于: 2021 年 04 月 02 日阅读数: 38
用户头像

John(易筋)

关注

问渠那得清如许?为有源头活水来 2018.07.17 加入

工作10+年,架构师,曾经阿里巴巴资深无线开发,汇丰银行架构师/专家。擅长架构、算法、数据结构、设计模式、iOS、Java Spring Boot。易筋为阿里巴巴花名。

评论

发布
暂无评论
Java一套拳法刷掉n个遍历树的问题 John 易筋 ARTS 打卡 Week 43