写点什么

算法从有序数组中移除重复的数据,AI 学习资源 2020 John 易筋 ARTS 打卡 Week 38

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

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

笔者的文章:

算法:从有序数组中移除重复的数据26. Remove Duplicates from Sorted Array

LeetCode 全集请参考:LeetCode Github 大全


题目

26. Remove Duplicates from Sorted Array

Given a sorted array nums, remove the duplicates in-place such that each element appears only once and returns the new length.


Do not allocate extra space for another array, you must do this by modifying the input array in-place with O(1) extra memory.


Clarification:


Confused why the returned value is an integer but your answer is an array?


Note that the input array is passed in by reference, which means a modification to the input array will be known to the caller as well.


Internally you can think of this:


// nums is passed in by reference. (i.e., without making a copy)int len = removeDuplicates(nums);
// any modification to nums in your function would be known by the caller.// using the length returned by your function, it prints the first len elements.for (int i = 0; i < len; i++) { print(nums[i]);}
复制代码


Example 1:


Input: nums = [1,1,2]Output: 2, nums = [1,2]Explanation: Your function should return length = 2, with the first two elements of nums being 1 and 2 respectively. It doesn't matter what you leave beyond the returned length.
复制代码


Example 2:


Input: nums = [0,0,1,1,1,2,2,3,3,4]Output: 5, nums = [0,1,2,3,4]Explanation: Your function should return length = 5, with the first five elements of nums being modified to 0, 1, 2, 3, and 4 respectively. It doesn't matter what values are set beyond the returned length.
复制代码


Constraints:


0 <= nums.length <= 3 * 104-104 <= nums[i] <= 104nums is sorted in ascending order.
复制代码


用两个指针解法

  1. 判断边界,如果数组为空则返回 0;

  2. 记录上一个数字 pre,和目前没有重复的位置 index;

  3. 遍历数组一直到找出跟上个数字不等,则把当前数字赋值给下个 index,并用当前数字替换 pre;


class Solution {    public int removeDuplicates(int[] nums) {        // check edge        if (nums == null || nums.length == 0) {            return 0;        }        int pre = nums[0];        int index = 1;        for (int k = 1; k < nums.length; k++) {            if (nums[k] != pre) {                nums[index] = nums[k];                index++;                pre = nums[k];            }        }                return index;    }}
复制代码


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

笔者的文章:

翻译:最令人印象深刻的YouTube频道,可让您学习AI,机器学习和数据科学

说明

数据科学是一个多学科领域,专注于数据分析和机器学习。例如,这项工作可以提供给 Web 应用程序,但是数据科学家的工作是分析和预测建模。


工作报告2020年的未来,同时看着日益战略和日益冗余岗位版显示全行业的相似之处。


对下一个未来的需求不断增长的领导者包括数据分析师和数据科学家,人工智能和机器学习专家,机器人工程师和数字转换专家。这些是不断扩大的知识领域,在社会中发挥着巨大作用。


在过去的几年中,我选择了 YouTube 上使用次数最多的最佳 AI,机器学习和数据科学频道。


您仍然可以使用这个疯狂的 2020 年来学习人工智能,Python 编程,机器学习,人工智能和数据科学。

1. SpringBoard

该频道发布了对来自 Google,Uber,Airbnb 等大公司的数据科学家的采访。从这些视频中,您可以了解成为数据科学家的感觉,并获得宝贵的建议以应用于您的生活。


2. Arxiv Insights

Xander Steenbrugge 是 ML6 的机器学习研究员。他的 YouTube 频道从技术角度概括了有关机器学习,强化学习和 AI 的关键点,同时使更多的受众可以使用它们。


3. Machine Learning 101

机器学习 101 是一个新的 ML Youtube 频道,每个人都应该检出,其中发布了有关初学者 AI 概念的讲解视频。该频道还发布了与专家数据科学家和从事商业行业 AI 的专业人员的播客。


4. FreeCodeCamp

FreeCodeCamp 是一个了不起的非营利组织。它是一个开放源代码社区,提供了一系列资源,可帮助人们学习免费编码和创建项目。它的网站是完全免费的,任何人都可以学习编码。此外,他们还有其新闻平台,可共享有关编程和项目的文章。

5. Data School

Kevin Markham 创建了深入的 YouTube 教程,以了解 AI 和机器学习。数据学院侧重于您首先需要掌握的主题,并提供无论您的教育背景如何都可以理解的深入教程。

6. Machine Learning TV

机器学习电视提供了资源,供计算机科学专业的学生和发烧友更好地了解机器学习。

7. Giant Neural Network

这个 YouTube 频道旨在让每个人都能更轻松地进行机器学习和强化学习。有12个视频播放列表,可为初学者全面介绍神经网络,并且似乎随后正在生产后续的中间神经网络系列。

8. Andreas Kretz

Andreas Kretz 是一名数据工程师和 Plumbers of Data Science 的创始人。他在自己的频道上直播了现场教程,介绍了如何获得数据工程方面的实践经验以及有关 Hadoop,Kafka,Spark 等数据工程的问题和解答的视频。


9. Edureka!

Edureka 是一个电子学习平台,其中包含有关大数据和 Hadoop,DevOps,区块链,人工智能,Angular,数据科学,Apache Spark,Python,Selenium,Tableau,Android,PMP 认证, AWS 架构师,数字营销等。

10. Andrew Ng 吴恩达 曾认百度首席科学家

Ng 被《时代》杂志评选为 2012 年“最具影响力的 100 位人物”之一,并被《快速公司》评为“最受信条人物”。他是 Coursera 和 deeplearning.ai 的共同创始人,曾任百度副总裁兼首席科学家。他是斯坦福大学的兼职教授。


11. Deeplearning.ai

官方的 Deep Learning AI YouTube 官方频道提供了 Coursera 上的深度学习专业知识的视频教程。DeepLearning.AI 由 Ng 创办,是一家教育技术公司,致力于发展全球 AI 人才社区。

DeepLearning.AI 以专家为主导的教育经验为 AI 从业人员和非技术专业人士提供了必要的工具,从基础到高级应用一直一路走来,使他们能够构建 AI 驱动的未来。

12. Tech with Tim

Tech With Tim 是一位出色的程序员,他教授 Python,Pygame,Java 和机器学习的游戏开发。他使用 Python 创建了高级编码教程。

13. Machine Learning University (MLU)

机器学习大学(MLU)成立于 2016 年,是亚马逊的一项直接目标:培训尽可能多的员工以掌握该技术,这对于公司实现利用该集成技术提供产品的“魔力”至关重要。


14. Artificial Intelligence — All in One

这个 YouTube 频道提供与科学,技术和人工智能相关的教学视频。


15. Sentdex

Sentdex 创建了 YouTube 上最好的 Python 编程教程之一。他的教程从初学者到更高级。包含 1000 多个有关 Python 编程教程的视频,它不仅提供了基础知识,还包括了更多内容。您可以了解有关机器学习,财务,数据分析,机器人技术,Web 开发,游戏开发等的信息。


16. Joma Tech

Joma Tech 是一位 YouTuber,他制作视频来帮助人们进入技术行业。他曾在大型技术公司担任数据科学家和软件工程师。根据他的经验,他制作了采访硅谷专家和生活方式的视频,并使数据科学更易于访问。

17. Python Programmer

Python 程序员的内容包括有关 Python,数据科学,机器学习,书籍推荐等的教程。


18. Deep Learning TV

这个 YouTube 频道的主题包括操作方法,软件库和应用程序的评论以及深度学习领域的关键人物访谈。DeepLearning.TV 涉及深度学习,这是一个学习领域,旨在教机器感知世界。该频道从简化深度学习的系列开始,以诸如“操作方法”,“软件库和应用程序的评论”以及对该领域关键人物的访谈等主题为主题。通过一系列概念视频,展示每种深度学习方法背后的直觉,我们将向您展示深度学习实际上比您想象的要简单。


19. Google Cloud Platform

YouTube 视频可帮助您构建安全基础架构,开发人员工具,API,数据分析和机器学习的下一步功能,帮助您构建安全基础架构,开发人员工具,API,数据分析和机器学习的下一步功能。


20. Keith Galli

Keith Galli 是麻省理工学院的应届毕业生。他制作有关计算机科学,编程,棋盘游戏等的教育视频。


21. Data Science Dojo

数据科学 Dojo 是一个承诺以一种易于理解的方式向所有人教授数据科学的渠道。您将找到有关数据工程和科学的大量教程,讲座和课程。


21. TechnoBotic

这是用于机器学习,数据科学和人工智能的非常不错的 Youtube 频道。这些视频介绍了 AI 和 ML 基础知识以及高级概念。

在这个渠道中,作者从实用性和可用性的角度总结了他的核心学习成果,同时使更多的读者可以访问。如果您喜欢机器学习,数据科学和人工智能,那么此频道适合您!


22. StatQuest

StatQuest 将复杂的统计和机器学习方法分解为易于理解的小片段。StatQuest 不会降低材料的质量。相反,它可以帮助您更好地了解统计学和机器学习。


23. Yannic Kilcher

Yannic 制作有关机器学习研究论文,编程和 AI 社区问题以及 AI 在社会中的更广泛影响的视频。


24. 还有一件事…

如果您想继续学习,我已经为您准备了一份很棒的清单,机器学习,深度学习和数据科学的培训课程,您现在可以免费进行以下培训:

参考

https://medium.com/swlh/21-amazing-youtube-channels-for-you-to-learn-ai-machine-learning-and-data-science-for-free-486c1b41b92a


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

笔者的文章:

《领域驱动设计精粹》DDD Domain-Driven Design Distilled -- Vaughn Vernon 读后感

说明

关于设计是否必要或是否负担得起的问题根本都没有问到点上:设计是不可或缺的。除了优秀设计就是糟糕设计,根本不存在“不做设计”一说。 -- Douglas Martin


《领域驱动设计精粹》-- Vaughn Vernon 是《领域驱动设计》的浓缩版。讲述了软件工程如何避免造成大泥球的混乱状况。从战略设计、战术设计提供了限界上下文(边界)、子域、上下文映射;聚合、领域事件、事件风暴等思维和工具。


大泥球


经过 DDD 设计

得到核心领域模型(以保单为例子)


1. 限界上下文

任何事情都要定义边界,因为资源、能力、时间都是有限的,在软件工程领域也一样。


限界上下文是语义和语境上的边界。限界上下文在开始阶段是问题空间的一部分,随着软件模型开始呈现出更深层次以及更清晰的含义时,限界上下文将会迅速转换到解决方案空间。

2. 子域 -- 战略设计

子域是整个业务领域的一部分,子域代表的是一个单一的、有逻辑的领域模型。

项目中又三种主要的子域模型:

  • 核心域(Core Domain): 一个唯一的、定义明确的领域模型,要对它进行战略投资,并在一个明确的限界上下文中投入大量资源去精心打磨通用语言。它是组织中最重要的项目,因为这将是你与其他竞争者的区别所在,必须把核心域打造成组织的核心竞争力。

  • 支撑子域(Supporting Subdomain): 这类建模场景提倡的是“定制开发”,因为找不到现成的解决方案。这类软件模型任非常重要,核心域的成功离不开它。

  • 通用子域(Generic Subdomain): 通用紫玉的解决方案可以采购现成的,也可以采用外包的方式。


3. 运用上下文映射进行战略设计

敏捷项目管理核心域必须和其它限界上下文进行集成。这种集成关系在 DDD 中称为上下文映射(Context Mapping).

映射的种类:

  1. 合作关系 Partnership:存在于两个团队之间,每个团队各自负责一个限界上下文。两个团队通过互相依赖的一套目标联合起来形成合作关系。一损俱损,一荣俱荣。


  1. 共享内核 Shared Kernel:两个限界上下文的交集表示。两个或更多团队之间共享着一个小规模但却通用的模型。团队必须就要共享的模型元素达成一致。


  1. 客户--供应商 Customer-Supplier: 描述的是两个限界上下文之间和两个独立团队之间的一种关系:供应商位于上游 U,客户位于下游 D。支配这种关系的是供应商,因为它必须提供客户需要的东西。


  1. 跟随者 Conformist:关系存在于上游团队和下游团队之间,上游团队没有任何动机满足下游团队的具体需求。由于各种原因,下游团队也无法投入资源去翻译上游模型的通用语言来适应自己的特定需求,因此只能顺应上游的模型。


  1. 防腐层 Anticorruption Layer:是最具防御型的上下文映射关系,下游团队在其通用语言(模型)和位于它上游的通用语言(模型)之间创建了一个翻译层。


  1. 开放性主机服务 Open Host Service: 会定义一套协议或接口,让限界上下文可以被当做一组服务访问。该协议是“开放的”,所有需要与限界上下文进行集成的客户端都可以相对轻松地使用它。通过应用程序编程接口(API)提供的服务都有详细的文档,用起来也很舒服。


  1. 已发布语言 Published Language: 是一种有着丰富文档的信息交换语言,可以被许多消费方的限界上下文简单地使用和翻译。需要读写信息的消费者可以把共享语言翻译成自己的语言,反之亦然,而在此过程中它们对集成的正确性充满信心。


  1. 各行其道 Separate Way : 使用各种通用语言来与一个或多个限界上下文集成这样的方式不能产生显著的回报。


  1. 大泥球 Big Ball of Mud: 处理大泥球或者要和它进行集成可能面临的严重问题。制造大泥球这种事应该人人避之唯恐不及。

解决大泥球问题的第一步,往往是先增加一个防腐层



3.1 善用上下文,推荐 RPC,RESTful,消息机制

4. 运用聚合进行战术设计


  1. 聚合:这里展示了两个聚合。它们都是由一个或多个实体组成,其中一个实体被称为聚合根(Aggregate Root)。聚合的组成还可能包含值对象。

  2. 实体:一个实体模型就是一个独立的事物。每个实体都拥有一个唯一的标识符,可以将它的个体性和其它类型相同或者不同的实体区分开。

  3. 值对象:是对一个不变的概念整体所建立的模型。


4.1 聚合的经验法则

  1. 在聚合边界内保护业务规则不变性。


  1. 聚合要设计得小巧。


  1. 只能通过标识符引用其它聚合。


  1. 使用最终一致性更新其它聚合。

5. 运用领域事件进行战术设计

领域事件 Domain Event 是一条记录,记录着在限界上下文 Bounded Context 中发生的对业务产生重要影响的事件。领域事件是非常重要的战略设计工具。领域事件往往会在战术设计的过程中被概念化并演变成核心域的组成部分。


事件溯源 Event Sourcing 对所有发生在聚合实例上的领域事件进行持久化,把它们当做对聚合实例变化的记录。存储的是发生在聚合上的所有独立事件,而不是把聚合状态作为一个整体进行持久化。


6. 总结

当使用 DDD 时,我们的任务是深入学习业务如何运作,然后基于学习的范围建立软件模型。这实际上是一个学习、试验、质疑、再学习和重建模型的过程。我们需要从大量学到的内容中研磨和提炼知识,并创造出能有效满足组织战略需要的设计。我们面临的挑战是如何快速学习。如果不能按时、按预算交付,无论我们的软件可以达到什么样的高度,我们都会失败。但每个人都希望我们在各个方面取得成功。


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

笔者的文章:

极客大学产品经理训练营 产品文档和原型 作业4

作业

  • 【本周作业】写一个用例,挑一个:你自己的产品 / 你喜欢的产品 / 【拍东西】发起拍卖/ 【知识星球】加入星球/ 【极客时间】购买课程;


1. 标题作者修改历史

标题:【极客时间】购买课程

作者| 历史 | 时间

  • | - | -

易筋 | 创建 | 2021-01-09


2. 简要描述

极客时间 App, 为用户提供购买课程功能。购买的主要渠道有极客时间 App 内购买,微信购买,购买返现等。

3. 利益相关者 / 涉众 / 参与人及其相关利益


4. 事件流:进本流程 / 扩展流程 / 异常流程

基础流程

  1. 用例开始

  2. 浏览课程、搜索课程

  3. 点击购买

  4. 支付

  5. 购买成功

  6. 课程加入已购列表

  7. 用例结束

扩展流程

  • 3a. 课程没显示购买按钮

3a1. 系统提示用户,点击刷新页面

3a2. 重新刷新页面

3a3. 用例结束


  • 4a. 支付密码错误

4a1. 系统提示用户,支付密码错误

4a2. 请重试

4a3. 重试成功

4a4. 用例结束


  • 4b. 银行卡余额不足

4b1. 系统提示用户,银行卡余额不足,提示换卡或者其它支付方式

4b2. 点击换卡

4b3. 输入银行卡信息

4b4. 输入支付密码

4b5. 执行用例 5


5. 辅助图例


6. 前置条件 / 后置条件

前置条件:已注册、已登录;

后置条件:给推荐用户返现

7. 术语表(*)

返现:给推荐的用户返回一定比例的现金。在余额中可以体现。


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

John(易筋)

关注

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

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

评论

发布
暂无评论
算法从有序数组中移除重复的数据,AI学习资源2020 John 易筋 ARTS 打卡 Week 38