写点什么

移除数组中的数字,不用额外空间, 实战 RxSwift 中的 Observable, subscribe, dispose, 吴军老师态度读后感 John 易筋 ARTS 打卡 Week 39

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

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

笔者的文章:

算法:移除数组中的数字,不用额外空间27. Remove Element


LeetCode 全集请参考:LeetCode Github 大全

# 题目

27. Remove Element

Given an array nums and a value val, remove all instances of that value in-place and return 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.


The order of elements can be changed. It doesn't matter what you leave beyond the new length.


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 = removeElement(nums, val);
// 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 = [3,2,2,3], val = 3Output: 2, nums = [2,2]Explanation: Your function should return length = 2, with the first two elements of nums being 2.It doesn't matter what you leave beyond the returned length. For example if you return 2 with nums = [2,2,3,3] or nums = [2,2,0,0], your answer will be accepted.
复制代码


Example 2:


Input: nums = [0,1,2,2,3,0,4,2], val = 2Output: 5, nums = [0,1,4,0,3]Explanation: Your function should return length = 5, with the first five elements of nums containing 0, 1, 3, 0, and 4. Note that the order of those five elements can be arbitrary. It doesn't matter what values are set beyond the returned length.
复制代码


Constraints:


0 <= nums.length <= 1000 <= nums[i] <= 500 <= val <= 100
复制代码


1. 逐位 copy 解法


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


2. 头尾想换 高效率解法


class Solution {    public int removeElement(int[] nums, int val) {        // check edge        if (nums == null || nums.length == 0) {            return 0;        }        int index = 0;        int n = nums.length - 1;        while (index <= n) {            if (nums[index] == val) {                nums[index] = nums[n];                nums[n] = val;                n--;            } else {                index++;            }        }                return index;    }}
复制代码


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

笔者的文章:

翻译:实战RxSwift中的Observable, subscribe, dispose

可观察的生命周期


在上图中,可观察到的发射了 9 个元素。当一个可观察对象发出一个元素时,它会在下一个事件中发出它。


Observable发出三个轻击事件,然后结束。这称为completed事件。


可观察对象发出error包含错误的事件。如果一个可观察对象发出一个error事件,则它也将终止并且不能再发出其他任何事件。


一个observable发出next包含元素的事件。

初始化环境

创建一个项目命名为 RXSwiftDemo,在命令行pod init, 在podfile 中填写如下内容,并运行pod install.


# Uncomment the next line to define a global platform for your project# platform :ios, '9.0'
target 'RXSwiftDemo' do # Comment the next line if you don't want to use dynamic frameworks use_frameworks!
# Pods for RXSwiftDemo pod 'RxSwift', '6.1.0' pod 'RxCocoa', '6.1.0'
target 'RXSwiftDemoUITests' do pod 'RxBlocking', '6.1.0' pod 'RxTest', '6.1.0' end
end
复制代码


打开workspace就可以进行实战。


创建 observable

just恰当地命名,因为它所做的只是创建一个包含just单个元素的可观察序列。


在操作者从元件的规则阵列创建一个可观察到的个体类型实例的from


您可以of用来创建observable的数组或创建单个类型的可观察的数组。


下面的示例可以辨别justoffrom


 let one = 1  let two = 2  let three = 3  /// This is a singe element observable  let observable: Observable<Int> = Observable<Int>.just(one)    /// This is an observable of individual type instances from a array  let observable2 = Observable.of(one, two, three)    /// This is an observables array using of to create  let observable3 = Observable.of([one, two, three])    /// This is an observable of individual type instances from a array  let observable4 = Observable.from([one, two, three])
复制代码


订阅观察值 subscribe

订阅RxSwift可观察对象是非常相似的;您称观察为可观察的 subscribing。


因此addObserver(),您可以使用代替subscribe()


NotificationCenter开发人员通常仅使用其.default单例实例不同,Rx中的每个可观察实例都不同。


更重要的是,observable只有拥有订阅者才能发送事件。

遵守可观察变量的例子


let one = 1  let two = 2  let three = 3  /// This is an observable of individual type instances from a array  let observable = Observable.of(one, two, three)    /// Subscribes an element handler  observable.subscribe(onNext: { element in    print(element) // Result will be: 1,2,3  })    /// Subscribes an event handler to an observable sequence.  observable.subscribe { event in    print(event) // Result will be: next(1) next(2) next(3) completed  }
复制代码

empty操作者创建具有零个元素的空可观察序列。它只会发出一个.completed事件。


let observable = Observable<Void>.empty()    observable      .subscribe(        onNext: { element in          print(element)      },        /// When empty an observable, it will go to completed block        onCompleted: {          print("Completed")      }    )
复制代码

never操作创建一个可观察到的不排放任何东西,从来没有终止


/// If never an observable, it will not emit anythinglet observable = Observable<Any>.never()    observable      .subscribe(        onNext: { element in          print(element)      },        onCompleted: {          print("Completed")      }    )
复制代码

处置和终止 dispose

要明确取消订阅,请调用dispose()它。取消订阅或取消订阅后,dispose当前示例中的observable将停止发出事件


let observable = Observable.of("A", "B", "C")  let subscription = observable.subscribe { event in    print(event)  }  /// When dispose, the observable can not emit anything  subscription.dispose()
复制代码


单独管理每个订阅将很乏味,因此RxSwift包含一个DisposeBag类型。处置袋可容纳通常使用此.disposed(by: disposeBag)方法添加的一次性用品,并dispose()在处置袋即将被释放时将呼叫每个处置袋。


let disposeBag = DisposeBag()        Observable.of("A", "B", "C")            .subscribe {            print($0)            }.disposed(by: disposeBag)
复制代码

create运营商有一个名为一个参数subscribe。它的工作是提供可观察的调用订阅的实现。

使用create定制的可观察


let disposeBag = DisposeBag()Observable<String>.create { (observer) -> Disposable in            observer.onNext("1")            observer.onNext("?")                        return Disposables.create()        }.subscribe(            onNext: { print($0) },            onError: { print($0) },            onCompleted: { print("Completed") })        .disposed(by: disposeBag)
复制代码


建立可观察的工厂

deferred 延迟读取值直到订阅.


deferred有一个需要记住的特征。每次有新观察者时,deferred都会从其关闭中创建Observable。这意味着订阅 2 次将创建 2 个可观察对象。它会影响性能,但不太可能发生

deferred订阅长计算功能时会有所帮助(如果使用create或,则会阻塞just


let disposeBag = DisposeBag()var flip = false                let factory: Observable<Int> = Observable.deferred { () -> Observable<Int> in            flip = !flip                        if flip {                return Observable.of(1, 2, 3)            } else {                return Observable.of(4, 5, 6)            }        }                for _ in 0...1 {            factory.subscribe(onNext: {                print($0, terminator: " ... ")            }).disposed(by: disposeBag)            print()        }
复制代码


参考

https://medium.com/@duydtdev/observables-in-rxswift-f2f451df49b7


https://beeth0ven.github.io/RxSwift-Chinese-Documentation/content/rxswift_core/observable.html


https://github.com/ReactiveX/RxSwift


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

笔者的文章:

极客大学产品经理训练营:业务架构与概念模型 第10课总结


讲师:邱岳


1. 什么是状态图

系统中的概念或对象随着一些事件的发生,改变了状态,通常这个状态比较多、比较复杂时,我们需要用状态图来表示他们的边界,以及触发状态转换的活动。



2. 动手画 -- 员工状态转换状态图

状态图如何画得专业:

  1. 加个白底的背景框;

  2. 注释要用 45°的折角;

  3. 状态相互转换用曲线。


3. 状态图的价值

任何需要表达状态变化的业务场景,都应该有一张状态图,它几乎是可以完全代替口头沟通的一种图例,百利而无有害。还可以帮助我们发现可能的状态或状态转换缺失。


4. 什么是概念模型

概念模型是为真实世界建模的工具,它描述问题域内不同概念,以及概念之间的关系。它以直观的方式向领域专家和开发人员解释系统应当如何组织、如何工作、以及如何与用户互动。


Kindle,阅读类软件的概念模型


5. 心智模型

6. 概念模型

  • 在现实世界中,是一段描述

  • 在程序世界中,是代码和数据结构

  • 在用户眼里,是一堆样式、交互和界面


需要一个模型,帮助我们为现实世界中的描述建立结构化的模型,帮助我们了解如何构建和改进产品,澄清复杂性,指导系统结构和界面设计。还可以帮我们在不同的背景中建立共识,统一术语和出发点。



7. 概念模型设计过程

  • 用领域语言和用户语言进行【描述】,名词是可能的【实体】,动词是可能的【关系】。

  • 在不同的名字空间中,统一术语,删减不必要的【实体】。

  • 定义每两者之间的关系,并明确【一对多】,【多对一】,【一对一】,【多对多】的原则。

  • 找到不同实体的行为。


8. 动手画 -- 微信视频号 概念模型


9. 概念模型的价值

  • 有一个【完整】的系统视角,看到系统内的概念以及关系。

  • 帮助思考和澄清一些边界性的问题。

  • 有一个明确的概念关系统一沟通,统一开发、业务和用户视角。


9.1 概念模型的风险和问题

  • 画图一时爽,读图有可能比较困难。

  • 要靠大量的沟通,很难独立读懂。

  • 模型和当前用例/业务规则之间,可能存在差异(比如一个微信号关联几个视频号?)


9.2 一点小小的经验

  • 概念模型图,很多时候,对自己的意义大于对外沟通,是一个结构化提问的过程。

  • 通常做过开发,设计过表结构的人,更容易理解这个东西是啥,建议学。

  • 可能是需要迭代更多的一种图。

  • To B 业务中通常更加需要。

  • 规模到一定程度,可能就很难读懂了,建议有机拆解。


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

笔者的文章:

《态度》- 吴军 四十封启明家书 读后感

说明


《态度》- 吴军 四十封启明家书 读后感。此书相当大的内容和得到的《硅谷来信一》、《硅谷来信二》、《硅谷来信三》专栏重复。闪光点在于以家书的形式,吴军跟两位女儿梦华、梦馨的书信对话。


1. 人生哲学

1.1 乐观的人生态度

乐观的人生态度比什么都重要,美国的父母对孩子的学习不是要求很高,因为长大以后有没有出息不知道,但是从小到大的 18 年的快乐是能够享受的。吴军的父母不在孩子的面前吵架,说明环境对人的影响相对重要。


吴军自认为还是一个充满快乐的人,主要在以下 4 个方面做得还算好。

  1. 不断地接收教育,与时俱进。

  2. 有理想并努力实现自己的愿望。

  3. 与人相处共事,尽可能互相尊重,相互包容。

  4. 看透人生。


1.2 幸福的来源

  1. 幸福的来源来自基因的传承。吴军曾经说过人生必须做的第一件事是恋爱、结婚、生子。

  2. 人生的一条河,人的影响力有河流的长度、深度、广度三个维度决定的。要有所传承。


1.3 成功是成功之母

如果有人跟你说 1+1 != 3 ,这是正确的废话,因为 1 + 1 != 4、5、6... 失败是成功之母是为了鼓励失败者不要放弃。但是真正有指导意义的是,成功是成功之母。如果一件事情能做到 100%,总结一下成功的方法,换个事情通常也能做得好。


1.4 好习惯成就一生

命运,命 Fate,运 Fortune 很重要。吴军接触了很多办公司成功,把它们推上市的创始人,他们几乎无一例外地承认,自己不过是运气好一点而已。


命运有什么决定呢?是基因。英国著名的女首相撒切尔夫人对这种基因辽很精辟的分析,她说:

  1. 注意你的想法,因为它能决定你的言辞和行动。

  2. 注意你的言辞和行动,因为它能主导你的行为。

  3. 注意你的行为,因为它能变成你的习惯。

  4. 注意你的习惯,因为它能塑造你的性格。

  5. 注意你的性格,因为它能决定你的命运。


看一个人在小时候挨了一巴掌的反应,就能知道 TA 的命运。第一种,一巴掌扇回去(遇到拳王就一命呜呼了);第二种,认命,捂着脸走开(阿 Q、祥林嫂那就认怂了);第三种,先冷静分析,也许是我们真该被扇,那就接受教训,也许对方真的就是个浑蛋,我们也许该叫警察或者他的家长、老板来管他,当然也可以有人日后找机会整治他,让他记住教训。


2 洞察世界

2.1 好运气背后是三倍的努力

孩子,如果你想获得 10 分的成绩,仅仅准备 10 分的努力是远远不够的,你可能要准备 30 分的努力。有时,我们看到某些人有一些运气,似乎偶然得到了他们想要的东西。其实,这些运气背后,可能是 30 分的努力。


英国教育家约翰·纽曼曾经这样描述一种理想的大学教育:


先生们,如果让我必须在那种由老师管理,修够学分就能毕业的大学和那种没有教授、考试,让年轻人在一起共同生活、互相学习三四年的大学(比如在过去的几十年里牛津大学就是这么做的)中选择一种,我将毫不犹豫地选择后者。

>为什么呢?我是这样想的,当许多聪明、求知欲强、富有同情心且目光敏锐的年轻人聚到一起,即使没有人教,他们也会相互学习。他们会互相交流,了解新的思想和看法,看到新鲜的事物,并且掌握独到的行为判断力。


3. 对待金钱

4. 人际关系

5. 有效学习

6. 做人做事


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

John(易筋)

关注

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

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

评论

发布
暂无评论
移除数组中的数字,不用额外空间, 实战RxSwift中的Observable, subscribe, dispose, 吴军老师态度读后感 John 易筋 ARTS 打卡 Week 39