写点什么

数据科学的门槛将提高,架构设计 UML,John 易筋 ARTS 打卡 Week 04

用户头像
John(易筋)
关注
发布于: 2020 年 06 月 14 日

每周完成一个 ARTS:

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

Review: 阅读并点评至少一篇英文技术文章

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

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

zgpeace 立个Flag:坚持ARTS 10年,今天是2020-05-04 ~ 2030-05-04,漏掉一次微信群发红包100大洋。



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

1367. Linked List in Binary Tree

Given a binary tree root and a linked list with head as the first node. 

Return True if all the elements in the linked list starting from the head correspond to some downward path connected in the binary tree otherwise return False.

In this context downward path means a path that starts at some node and goes downwards.

 

Example 1:





Input: head = [4,2,8], root = [1,4,4,null,2,2,null,1,null,6,8,null,null,null,null,1,3]
Output: true
Explanation: Nodes in blue form a subpath in the binary Tree.



Example 2:





Input: head = [1,4,2,6], root = [1,4,4,null,2,2,null,1,null,6,8,null,null,null,null,1,3]
Output: true



Example 3:



Input: head = [1,4,2,6,8], root = [1,4,4,null,2,2,null,1,null,6,8,null,null,null,null,1,3]
Output: false
Explanation: There is no path in the binary tree that contains all the elements of the linked list from head.



Constraints:

  • 1 <= node.val <= 100 for each node in the linked list and binary tree.

  • The given linked list will contain between 1 and 100 nodes.

  • The given binary tree will contain between 1 and 2500 nodes.



解决思路:这里用到两个深度优先遍历。

  1. 重点的思维应该是链表为主,比如链表第一个就是对的,那么就用树的深度优先遍历dfs继续判断(注意:树是下个结点左右子树是或的关系,只要一个是对的,那么结果是对的),整个链表是否都是对的,如果是对的,则直接返回结果。

  2. 如果链表的第一个结点就是错的,那么判断 树的下一层结点(左右子树也是或的关系),判断左右子树从头开始对比链表。

  3. 递归的注意点:第一个条件应该是写退出递归的条件,如果链表为null,说明是true;如果数为null,说明是false。



/**
* Definition for singly-linked list.
* public class ListNode {
* int val;
* ListNode next;
* ListNode(int x) { val = x; }
* }
*/
/**
* Definition for a binary tree node.
* public class TreeNode {
* int val;
* TreeNode left;
* TreeNode right;
* TreeNode(int x) { val = x; }
* }
*/
class Solution {
public boolean isSubPath(ListNode head, TreeNode root) {
// exit
if (head == null) {
return true;
}
if (root == null) {
return false;
}
if (dfs(head, root)) {
return true;
}
return isSubPath(head, root.left) || isSubPath(head, root.right);
}
public boolean dfs(ListNode head, TreeNode root) {
// exit
if (head == null) {
return true;
}
if (root == null) {
return false;
}
if (head.val != root.val) {
return false;
}
return dfs(head.next, root.left) || dfs(head.next, root.right);
}
}



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

为什么数据科学这个香饽饽的职业失去了吸引力,这篇文章讲述了很多应届生或者老工程师转行为数据科学领域,因为这块职位比较空缺,平均年薪工资在120K美金。入职门槛只要学学算法,面试过了就可以入职。数据科学的职位只要工作内容是使把没有结构的数据,整理为有结构的数据,并分析其中的价值。现在Google和Microsoft推出了AutoML,这款工具平均的费用在4K~40K,所以这块工作将会被这款工具取代。当时学习这款工具AutoML的门槛要求会比较高,比如要有相关领域的多年工作经验。

Why Is Data Science Losing Its Charm?

https://towardsdatascience.com/why-is-data-science-losing-its-charm-3f7780b443f5



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

博客:

判断iOS机器是否支持TouchId, FaceId



说明

iPhone X 以后支持Face ID, iPhone 5S以后支持Touch ID. 怎么准确判断机器是否支持,Face ID或者Touch ID呢? 实际上系统有方法判断,但是如果没有注册Face ID或者Touch ID,判断结果也是none



解决方法

用swift 5来解决

import Foundation
import LocalAuthentication
extension LAContext {
enum BiometricType: String {
case none
case touchID
case faceID
}
var biometricType: BiometricType {
var error: NSError?
guard self.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) else {
// Capture these recoverable error through fabric
return .none
}
if #available(iOS 11.0, *) {
switch self.biometryType {
case .touchID:
return .touchID
case .faceID:
return .faceID
default:
return .none
}
}
return self.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: nil) ? .touchID : .none
}
}



调用方法

// need to import LocalAuthentication in the calling file
// import LocalAuthentication
let currentType = LAContext().biometricType
print("biometry type > \(currentType)")
// biometry type > touchID



如果用模拟器来调试,需要开启Touch ID或者Face ID已经注册。设置路径如下

Simulator > Hardware > Touch ID/Face ID > Enrolled.



参考

https://stackoverflow.com/questions/46887547/how-to-programmatically-check-support-of-face-id-and-touch-id/62299672#62299672



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

极客大学架构师训练营 听课总结 - 架构视图,设计文档 -- 第二课



说明



如何画架构视图,如何写出设计文档

讲课老师 – 李智慧



4+1 视图模型



架构视图有很多种,不同的人给不同的架构视图。

架构师不能只用一种视图解决所有问题。



软件开发的本质是什么?如何进行软件架构设计?



备注:4+1架构模型,4+1架构视图 在工业上不常用,了解即可。

什么是模型?

模型是一个系统的完整的抽象。人们对某个领域特定问题的求解及解决方案,对他们的理解和认识都蕴含在模型中。



通常,开发一个计算机系统是为了解决某个领域特定问题,问题的求解过程,就是从领域问题倒计算机系统的映射。



在还没工程师之前,架构师要有系统的抽象,对现实业务的抽象。

需要考虑有哪些模型,哪些模块,哪些类,怎么交互的?

领域问题: 开发的时候,要理解业务。

概念模型:要有抽象能力,想象最终产品的样子。

系统需求:前瞻性地抽象出系统需求。

解决方案:提前列出关键问题的解决方案。



为什么要建造模型?

建造传统模型的目的

  • 为了证明某件事物能够工作

  • 前提: 建造模型的成本远远低于建造实物的成本

☞ 造飞机

☞ 建高楼



建造软件模型的目的

  • 为了与TA人沟通

  • 为了保存软件设计的最终成果

  • 前提:除非模型比代码更能说明问题



何时、何处画图?

何时画图?

  • 讨论、交流时

  • 最终设计文档

☞ 只保留少量的、重要的图

☞ 避免涉及过多内容和实现细节



何处画图?

  • 白板

  • 绘图工具, 如:StarUML、Gliffy Diagrams、Visio、Aastah

  • draw.io



UML 简介

什么是UML?

  • Unified Modeling Language, 或统一建模语言

  • 以图形方式描述软件的概念



可用来描述:

  • 某个问题领域

  • 构思中的软件设计

  • 描述已经完成的软件实现



UML图的分类 - 静态图

静态图 - 通过描述类、对象和数据结构以及它们之间存在的关系,来描述软件要素中不变的逻辑结构。

  • 用例图(Use Case Diagrams)

  • 对象图(Object Diagrams)

  • 类图(Class Diagrams)

  • 组件图(Component Diagrams)

  • 包图(Package Diagrams)

  • 部署图(Deployment Diagrams)



UML图的分类 - 动态图

动态图 - 通过描述执行流程或者实体状态变化的方式,来展示软件实体在执行过程中的变化过程。

  • 协作图(Collaboration Diagrams)

  • 序列图(Sequence Diagrams)

  • 活动图(Activity Diagrams)

  • 状态图(State Diagrams)



通用模型元素

可以在图中使用的概念统称为模型元素。模型元素在图中用其相应的视图元素(符号)表示,下图给出了常用的元素符号:类、对象、结点、包和组件等。



模型元素和模型元素之间的连接关系也是模型元素,常见的关系有接口实现(Interface Realization)、继承泛化(Generalization)、依赖(Dependency)、关联(Association)、聚合(Aggregation)和组合(Composition)。这些关系的图示符合如图所示。

  • 实现 Interface Realization:接口的实现。

  • 继承/泛化 Generalization:表示一般与特殊的关系,即“一般”元素是“特殊”关系的泛化。类上表示继承的关系。

  • 依赖 Dependency:表示一个元素以某种方式依赖于另一种元素。一般表示方法内的局部变量,或者参数。

  • 关联 Association:连接(connect)模型元素及链接(link)实例。一般表示类的属性。

  • 聚合 Aggregation:表示整体与部分的关系。整体的生命周期结束,部分不一定。

  • 组合 Composition:表示整体与部分的强关系。整体与部分的生命周期一致。



弱关系:接口实现、依赖、聚合。

强关系:类继承、关联、组合。



发布于: 2020 年 06 月 14 日阅读数: 68
用户头像

John(易筋)

关注

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

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

评论

发布
暂无评论
数据科学的门槛将提高,架构设计UML,John 易筋 ARTS打卡Week 04