0%

Observer

观察者Observer的作用就是监听事件,然后对这个事件作出响应。任何响应事件的行为都是观察者。

比如,点击按钮后弹出一个提示框,那么“弹出一个提示框”就是观察者。

创建观察者
  • subscribe方法中创建

    1
    2
    3
    4
    5
    6
    7
    8
    let observable = Observable.of("A","B","C")
    observable.subscribe( onNext: { element in
    print(element)
    }, onError: { error in
    print(error)
    }, onCompleted: {
    print("completed")
    })
  • bind方法中创建

    阅读全文 »

题目描述

给你一个链表的头节点 head,判断链表中是否有环。

如果链表中有某个节点,可以通过连续跟踪 next指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos来表示链表尾连接到链表中的位置(索引从0 开始)。注意:pos不作为参数进行传递 。仅仅是为了标识链表的实际情况。

如果链表中存在环 ,则返回 true。 否则,返回 false

示例1

1
2
3
输入:head = [3,2,0,-4], pos = 1
输出:true
解释:链表中有一个环,其尾部连接到第二个节点
阅读全文 »

题目描述

给定一个链表的头节点 head,返回链表开始入环的第一个节点。 如果链表无环,则返回 null

如果链表中有某个节点,可以通过连续跟踪 next指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos来表示链表尾连接到链表中的位置(索引从0开始)。如果 pos是 -1,则在该链表中没有环。注意:pos不作为参数进行传递,仅仅是为了标识链表的实际情况。

不允许修改 链表

示例1

1
2
3
输入:head = [3,2,0,-4], pos = 1
输出:返回索引为 1 的链表节点
解释:链表中有一个环,其尾部连接到第二个节点
阅读全文 »

订阅Observable

有了Observable,我们还要使用subscribe()方法来订阅它,接收它发出的Event

订阅方法1

使用subscribe()订阅一个Observable对象,该方法的block回调参数就是被发出的event事件:

  • 初始化Observable序列时设置的默认值都按顺序通过.next事件发送出来;
  • Observable序列的初始数据都发送完毕,它还会自动发一个.completed事件出来。
    阅读全文 »

题目描述

给你一个链表数组,每个链表都已经按升序排列。

请你将所有链表合并到一个升序链表中,返回合并后的链表。

示例:

1
2
3
4
5
6
7
8
9
10
输入:lists = [[1,4,5],[1,3,4],[2,6]]
输出:[1,1,2,3,4,4,5,6]
解释:链表数组如下:
[
1->4->5,
1->3->4,
2->6
]
将它们合并到一个有序链表中得到
1->1->2->3->4->4->5->6
1
2
输入:lists = []
输出:[]
阅读全文 »

题目描述

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

比如:

1
2
输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]
1
2
输入:l1 = [], l2 = []
输出:[]
1
2
输入:l1 = [], l2 = [0]
输出:[0]

提示:

  • 两个链表的节点数目范围是 [0, 50]
  • -100 <= Node.val <= 100
  • l1l2 均按 非递减顺序 排列
阅读全文 »

Observable

Observable<T>就是可观察序列,可以异步地产生一系列的event

  • 一个Observable<T>对象会随着时间推移不定期地发出event( element: T )
  • Event可以携带数据,它的泛型<T>用来指定Event携带的数据的类型;
  • 有了可观察序列,还需要有一个Observer来订阅它,这样订阅者才能收到Observable<T>不时发出的Event
Event

Event是一个枚举,表示Observable发出的事件,共有三种类型:

阅读全文 »

题目描述

给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表。

k 是一个正整数,它的值小于或等于链表的长度。

如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序。

进阶:

你可以设计一个只使用常数额外空间的算法来解决此问题吗?
你不能只是单纯的改变节点内部的值,而是需要实际进行节点交换。

题解

递归法:

  1. 链表需要分组后对每组进行反转,然后将反转后的各组进行连接;
    阅读全文 »

题目描述

给你单链表的头指针 head 和两个整数 left right ,其中 left <= right 。请你反转从位置 left 到位置 right 的链表节点,返回 反转后的链表 。

示例:

1
2
输入:head = [1,2,3,4,5], left = 2, right = 4
输出:[1,4,3,2,5]
1
2
输入:head = [5], left = 1, right = 1
输出:[5]

提示:

  • 链表中节点数目为 n
  • 1 <= n <= 500
  • -500 <= Node.val <= 500
  • 1 <= left <= right <= n
    阅读全文 »

题目描述

给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。

提示:

  • 链表中节点的数目范围是 [0, 5000]
  • -5000 <= Node.val <= 5000

示例

1
2
输入:head = [1,2,3,4,5]
输出:[5,4,3,2,1]
1
2
输入:head = []
输出:[]

题解

使用swift语言,需要声明链表结构:

1
2
3
4
5
6
7
8
9
// 单向链表,比如: 1->2->3->4->nil
class ListNode {
var val: Int
var next: ListNode?
init(_ val: Int) {
self.val = val
self.next = nil
}
}
阅读全文 »