Aspects是一个用于实现面向切片编程(AOP, Aspect-oriented programming )思想的第三方库。面向切片编程,指的是在运行时,动态地将代码切入到类的指定方法、指定位置上,从而得到改变方法的实现的目的。由于 Objective-C 本身是一门非常动态的语言,因此 AOP 在 Objective-C 这门语言中很容易利用 Runtime 进行实现。继续阅读

EasyTuple是由美团开源的一个第三方库,它给Objective-C 添加了元组的能力,可以将几个对象包裹在一个对象中,这样我们就可以从一个函数中返回多个值。它的使用非常简单,比如我们想创建一个由两个元素组成的元组,那么可以这样写:

如果使用 Xcode 辅助编辑器查看预编译后的代码,那么上面的例子在预编译后,会被展开为

可以看到原来的宏的写法会自动被转换成 Objective-C 中的类的创建语法了,那么这个转换过程是怎样发生的呢?下面让我们一步步地去分析这个转换的过程。继续阅读

在看完了《HTTP2基础教程》后,一直想写篇文章来总结下 HTTP2的特性和用法,但是我又不想把书上的内容往博客上照搬一遍,因此迟迟没有动笔。正好看到这么一个 PPT,是谷歌的一位 Web性能优化专家Ilya Grigorik 所做的分享,该 PPT 把 HTTP2的性能、特点等都介绍了一下,内容非常详实具体。我把这个 PPT 做成了一个拼图,贴在了这里(右键图片在新标签页中打开,可以看到更加清晰的大图哦):

Word Break

题意

给出一个字符串s和一个词典,判断字符串s是否可以被空格切分成一个或多个出现在字典中的单词。 给出

s = “leetcode”,dict = [“leet”,”code”],返回 true 因为“leetcode”可以被空格切分成“leet code”

思路

凡是和字符串有关的题,在应用动态规划方法时主要有两种思路:

  • dp[i][j]表示子串s[i,j]满足某一要求
  • dp[i]表示子串s[0,i]满足某一要求

继续阅读

题意

有一个消息包含A-Z通过以下规则编码:

现在给你一个加密过后的消息,问有几种解码的方式 ?如给出消息“12”,有两种解码的方法 AB(12) 或者 L(12),所以返回 2继续阅读

把相同类型的题目放在一起总结,可以便于整理思路,理解异同。下面是LeetCode上几道比较经典的可以使用回溯法来解决的题目,也是笔试面试时常考常问的。

在找实习时我就被问了两次Subsets这道题。因此熟练掌握这几道题,面试时遇到类似的题目即使是不能一下子写出正确的代码,至少也能按照正确的思路去思考。继续阅读

LeetCode 上有几道题都和排列组合有关,非常经典,值得放在一起总结一下。这几道题分别是:

  • Permutations。给定一组各不相同的数字,求这些数字的所有排列。
  • Permutations II。给定一组数字,这些数字中可能有重复的,求这些数字的所有不重复的排列。
  • Next Permutation。给定一组数字的全排列中的一个排列,求这个排列的下一个排列。
  • Permutation Sequence。给定一组数字和一个数字 K,求这组数字的全排列中,按照字典序顺序排序的第 K 个排列。

继续阅读

智能指针

shared_ptr 是C++11后引入的智能指针。智能指针的出现大大简化了C++程序员进行内存管理的逻辑,同时也避免了低级C++程序员可能写出的各种bug。陈硕老师在《Linux多线程服务器端编程》中总结道:

C++里可能出现的内存问题大致有这么几个:
1. 缓冲区溢出。
2. 空悬指针/悬挂指针
3. 重复释放
4. 内存泄漏
5. 不配对的new[]/delete
6. 内存碎片

正确使用智能指针能很轻易地解决前面5个问题。

shared_ptr 是智能指针中比较典型的一个。下面我们将从源代码的角度来进行分析,看看它是怎么实现的。源代码可以从GNU 处进行下载。继续阅读

在其他数字都出现偶数次的数组中找到只出现奇数次的1个数字

题目描述

给定一个数组 arr,其中只有一个数字出现了奇数次,其他数字都出现了偶数次,找出这个数字。

思路

使用异或运算符。我们可以声明一个变量 x,用它去和数组中的每个元素做异或运算,由于 n ^ n = 0, n ^ 0 = n,那么那些出现偶数次的数字和自身异或,结果为0。最后x中存的就是数组中只出现奇数次次的数字。继续阅读