Algorithm

LeetCode 70: 爬楼梯

假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢?
注意:给定 n 是一个正整数。
示例:

1
2
3
4
5
6
输入: 3
输出: 3
解释: 有三种方法可以爬到楼顶
1. 1 阶 + 1 阶 + 1 阶
2. 1 阶 + 2 阶
3. 2 阶 + 1 阶

思路:
本题是一道动态规划的题目,动态规划的核心思想是利用过去的结果解决未来的问题。即将问题分解为相对简单的子问题,顺序求解并保存结果,为下一子问题的求解提供信息。类似数学中的递推法
对于本题,当总台阶数为 1 时,到达楼顶的方法为 1 ,总台阶数为 2 时,到达楼顶的方法为 2 。这便是我们已有解的子问题,下一步就是如何通过已知的条件去解决目标问题。对于本题而言,总台阶数为 n 的问题的解等于总台阶数为n - 1n - 2的解的,因为前两个台阶到达目标台阶的方式唯一且互斥(走 1 步或 2 步)。

解答:

1
2
3
4
5
6
7
8
9
10
class Solution {
func climbStairs(_ n: Int) -> Int {
guard n > 2 else { return n } // n = 1, n = 2
var solutions = [0, 1, 2]
for index in 3 … n {
solutions.append(solutions[index-1] + solutions[index-2])
}
return solutions[n]
}
}

  • 时间复杂度:O(n),空间复杂度:O(n)

Review

When to Use Swift Structs and Classes

本文是一篇老文章了,来自Mike Ash 。因为之前在面试中常被问到classstruct的区别。所以想分享一下这篇文章。
其实最大的区别就是语义上的区别了,也是本文着重想要表达、同时也是我们日常使用时最应注意的问题:

struct是值类型,class是引用类型

语义上的区别背后是两者存储方式的不同,struct存储在上,class存储在上,而class的引用保存在上。

对于值类型,当你对数据进行赋值时,你得到的是该数据的拷贝。而对于引用类型,你得到的将是对该数据引用的拷贝。

文中还对值语义进行了探讨,虽然很多语言坚持“万物皆对象”,甚至数字都是引用类型的,但它们不免会使用不可变类型,对于这样的类型而言,值/引用的区别消失了,或者说区别仅仅在于性能表现上了。

如何选择值类型引用类型的核心问题在当数据被赋值后你希望得到一份数据的拷贝还是一份引用的拷贝,这就需要在具体的场景中分析了。

对于嵌套类型,有以下四种情况:

  • 引用类型中包含引用类型
    并无特殊表现,持有外部或内部的引用均可改变该引用指向的值,且都可感知数据变化
  • 值类型中包含值类型
    并无特殊表现,嵌套的值类型被赋值时均会拷贝其内容
  • 引用类型中包含值类型
    外部的引用被赋值时,内部的会被拷贝
  • 值类型中包含引用类型
    这种情况会破坏值语义,当外部数据被赋值时,内部数据仅会拷贝其引用。

Tip

本周因为刚入职,主要在配置环境和熟悉文档😂。所以记录下 SSH key 的生成:

  1. 在终端输入ssh-keygen
  2. 确认默认路径.ssh/id_rsa
  3. 输入密码,也可跳过
  4. 打开 ssh 公钥文件:~/.ssh/id_rsa.pub,复制其中内容
  5. 粘贴至相应平台如 github

SSH 为 Secure Shell(安全外壳协议) 的缩写,是一种加密的网络传输协议。该协议在网络创建安全隧道来实现 SSH 客户端与服务端的连接。
非对称加密的方式身份验证。


Share

如何阅读别人的代码

该篇文章出自垠神,因为上周刚刚接手项目,首要任务就是熟悉业务和代码。当然垠神跟我等菜鸡的关注点肯定是不同的,他的方式也不一定适用,因此算是借题发挥吧。

首先要了解的是项目的整体框架和工程的组织结构,一般主工程会按照业务模块划分,当然也可能会包括一些工具类或三方的组件啥的。另外工程的配置、引入的frameworklibrary也应该了解一下。有些项目还会混编 Objective-cSwift。如果能用类图或思维导图将项目框架构建出来肯定是更好的。

一般 iOS 工程会用第三方的库管理工具如 CocoaPods ,因此需要了解项目使用了哪些第三方库,在 iOS 中许多应用方向的三方库都具有“垄断”地位,如AFNetworkingFMDBMasonry等等,因此了解这些三方库的使用及实现就非常重要,即使项目中对其进行二次封装也可以很快上手。

接下来就是代码的熟悉了,有些公司会有代码规范的要求或接入了规范检查工具,因此最好先了解下具体要求。另外就要看看是否有编程范式的要求或使用了某些框架如RxPromiseKit啥的。

当然只看不写效果不会太好,最好从模块业务或组件入手去实际开发,多和同事沟通,多请大伙给你 code review ,慢慢从点扩展到面,一定会很快上手的。