Tip-Review-Algorithm 第一期

Tip

「Debug Information Format」设置为 DWARF 提高编译速度

文章出处:为什么 Debug Information Format 改为 DWARF 可以提高编译速度?

DWARF是一种调试信息的存放格式,方便调试的时候,还原运行时的地址成为可读的源码符号和行号。

DWARF和的SYM编译生成时机

两种配置的区别

当我们选择 DWARF 时,其实就已经使用 DWARF 调试描述文件了,所以这个 DWARF 文件依旧会生成;不同的是当选择 DWARF with dSYM 时,Xcode 还会生成一个 dSYM 文件,其中显式包含 DWARF 从而帮助我们根据地址,找到方法符号及信息。

这也就是为什么要在 release 下要开启 DWARF with dSYM ,因为我们要去映射地址所对应的方法符号,方便我们排查问题。

Review

Useful (and obscure!) Foundation types in Swift「了解7种鲜为人知的类型」

这篇文章主要讲了几种Swift Foundation框架中虽然已经提供,但是人们不太了解和使用的基础类型。虽然说平时可能不怎么用到,但是了解了解总是没错的,一方面确实比较有趣,另一方面万一以后有场景需要,则可以避免编写代码了。

总结如下,代码就不放了:

  1. NSScanner,像C语言中的scanf一样,可以从字符串中取出指定的内容,比如说数字。NSScanner有个过滤机制,可以配置自己想取出的类型。所以这个类可以应用在一些简单的字符串匹配场景中,而不用去设置正则过滤了。

  2. NSCountedSet,类如其名,就是带了元素数目统计功能的set类。可以输入一个序列,然后得到统计结果,可以省去写字典key:in管理的功夫。

  3. NSCache,这个很有意思,这是一个集合类型,可以在系统内存不足时,自动从自身删除元素。虽然说删除的策略不太清楚,但是对于创建条目开销较大的场景,比如说图像的缓存,这就比自己通过字典进行缓存管理方便多了。这个贴个代码。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    final class ImageDownloader {
    let client: HTTPClient
    let cache = NSCache<NSString, NSData>()

    init(client: HTTPClient) {
    self.client = client
    }

    func load(imageUrl: URL, intoImageView imageView: UIImageView) {
    let key = imageUrl.absoluteString as NSString
    func apply(data: NSData) {
    let image = UIImage(data: data as Data)
    imageView.image = image
    }
    if let cachedData = cache.object(forKey: key) {
    apply(data: cachedData)
    return
    } else {
    client.data(from: imageUrl) { data in
    cache.setObject(data as NSData, forKey: key)
    apply(data: data as NSData)
    }
    }
    }
    }
  4. NSOrderedSet:跟NSCountedSet相似,是个自带排序功能的Set类。

  5. NSByteCountFormatter:formatter,能够字节数目转换成可读性更强的文件大小形式,比如(1024*1024)bytes –>”1 MB”。

  6. NSDataDetector:与NSScanner相似,内置功能强大些,比如可以从字符串中检测提取电话号码、网页链接等。

  7. CFBinaryHeap:目前Swift标准库还是缺少很多数据结构的,Swift官方最近也宣布了「Swift Algorithms」开源项目来进行补充。作者提到可以用提供的Tree和Heap实现比如CFTree和CFBinaryHeap,来实现一些比如优先级队列等数据结构。但是这是个C CoreFoundation类,并且还没桥接到Foundation,所以需要管理指针。所以作者就推荐了封装好的MCBinaryHeap

Algorithm

leetcode 238. 除自身以外数组的乘积

描述:

给你一个长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积。
不要使用除法,且在 O(n) 时间复杂度内完成此题。

思路:

构建两个数组,一个用于计算当前索引左边的累计乘积,一个用于计算当前索引右边的累计乘积,然后两个数组对同一索引进行相乘,就得到了除自身以外的数组乘积。时间复杂度: O(n),空间复杂度: O(n)。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Solution {
public:
vector<int> productExceptSelf(vector<int>& nums) {
int sz = nums.size();
vector<int> leftMultiply(sz);
vector<int> rightMultiply(sz);

leftMultiply[0] = 1;
rightMultiply[sz-1] = 1;
for (size_t i = 1; i < sz; i++)
{
leftMultiply[i] = leftMultiply[i-1] * nums[i-1];
rightMultiply[sz-1-i] = rightMultiply[sz-i] * nums[sz-i];
}

for (size_t i = 0; i < sz; i++)
{
leftMultiply[i] = leftMultiply[i] * rightMultiply[i];
}

return leftMultiply;
}
};

VSCode + LeetCode插件刷题真不错,
https://github.com/LeetCode-OpenSource/vscode-leetcode