树状数组也叫做二元索引树(Binary Indexed Tree),或者以其发明者命名为 Fenwick 树。 正如所有的整数都可以表示成 2 的幂和,同样可以把一串序列表示成一系列子序列的和。采用这个想法,可将一个前缀和划分成多个子序列的和,而划分的方法与数的 2 的幂和具有极其相似的方式。 通过使用大节点去表...
union-find 算法问题的输入是一列整数对,其中每个整数都表示一个某种类型的对象,一对整数 p q 可以被理解为「p 和 q 是相连的」 。 假设「相连」是 一种等价关系,这也就意味着它具有: 自反性:p 和 p 是相连的。 对称性:如果 p 和 q 是相连的,那么 q 和 p 也是相连的。 传递性:如果...
Kotlin 基础12 - Kotlin 与 Java 互操作
@JvmNameKotlin 顶层函数在 Java 里都被当作静态方法看待和调用。 可以使用 @JvmName 注解指定编译类的名字。加到文件的最上方。 @JvmOverloads设计一个可能会暴露给 Java 用户使用的 API 时,最好使用 @JvmOverloads 注解。 这样无论是 Kotlin 开...
Kotlin 基础11 - 使用 DSL 构建专用的语法结构
使用 infix 函数构建更可读的语法Kotlin 提供了一种高级语法糖特性:infix 函数。 infix 函数把编程语言调用的语法规则调整了一下,比如 A to B 这样的语法结构,实际上等价于 A.to(B) 的写法。 mapOf() 函数实际上接收的是一个 Pair 类型的可变参数列表。而 to() ...
使用协程可以在编程语言的层面实现不同协程之前的切换,从而提升并发编程的运行效率。 没有开启线程的情况下,先后调用 foo() 和 bar() 这两个方法,理论上输出的结果一定是 123456 。 如果使用了协程,在协程 A 中去调用 foo() 方法,协程 B 中去调用 bar() 方法,它们仍然会运行在同一...
委托委托是一种设计模式,它的基本理念是:操作对象自己不会去处理某段逻辑,而是会把工作委托给另外一个辅助对象去处理。 Kotlin 中将委托功能分为了两种:类委托和委托属性。 类委托类委托的核心思想在于将一个类的具体实现委托给另一个类去完成。 接收的 HashSet 参数相当于一个辅助对象,Set 接口中的所...
高阶函数像接收 Lambda 参数的函数可以称为具有函数式编程风格的 API,如果想要定义自己的函数式 API,那就需要借助高阶函数来实现了。 如果一个函数接收另一个函数作为参数,或者返回值的类型是另一个函数,那么该函数就称为高阶函数。 函数类型基本规则: -> 左边的部分用来声明该函数接收什么参数,多个...
扩展函数扩展函数表示即使在不修改某个类的源码的情况下,仍然可以打开这个类,向该类添加新的函数。 定义扩展函数的语法结构: 相比定义普通函数,定义扩展函数只需要在函数名前加上一个 ClassName. 的语法结构,就表示将该函数添加到指定的类当中了。 扩展专用文件的命名约定通常是扩展类型加 Ext 后缀。扩展...
Kotlin 基础06 - List、Set、Map、Sequence
ListList、Set 和 Map 类型的变量也分为两类:只读和可变。 能修改可变列表的函数有个统一的名字:mutator 函数。 List、Set、Map、IntRange 以及其他集合都属于 Iterable,都支持遍历操作(forEach 、forEachIndexed )。 List 集合支持一种叫...
标准函数Kotlin 标准库里有一些支持 lambda 的通用工具类标准函数。标准函数本质上都是扩展函数。 函数 是否传 receiver 值参给 lambda 是否有相关作用域 返回 T.let 是 否 lambda 结果 T.apply 否 是 接收者对象 T.run 否 是 lambd...
第 4 页 / 共 8 页