iOS静态库总结
iOS静态库使用总结总体流程
创建Cocoa Touch Static Library 实现对应的逻辑
设置暴露的头文件
模拟器和真机分别编译。 (分release和debug,可以在Edit Scheme中 Build Configuration中选择debug或者release,对外提供的framework尽量是relese版本)
合并静态库 lipo -create xx1.a x2.a -output xx3.a (把静态库xx1和xx2,合并成一个 xx3静态库)
静态库是iOS中资源打包的方式 .a文件 (在Product文件夹中)
需要手动引入头文件使用
一般要设置Other Linker Flags 等
PS
因为静态库.a文件是一个二进制文件,需要在Target-Build Phases-Copy Files中添加对应的头文件。编译之后,会在Product include文件夹中得到暴露的头文件,配合二进制的文件,使用者就可以使用静态库
每次编译的时候会在Product文件生成.a。真机和模拟器的架构不一样,需要分别编译然后合成成一个来方便调试(第四步)。但是
位运算压缩坐标(x, y)的技巧以及背后原理
使用位运算压缩坐标(x, y)的技巧以及背后原理
把一个int型坐标(x, y)转换成一个long long类型的整数,方便存储位置状态。
思路假如题目给了很多坐标,需要保存坐标的唯一标识,从而表示坐标的状态信息。
因为坐标是int型是32位的(64位机),而long long类型是64位的。 所以可以让高的32保存x的坐标,低32位保存y的坐标。
在编码(encode)的使用,先把x坐标和y坐标转换成long long类型,并向左移32位(左移补0)。然后用把当前数按位或y坐标。得到低32位是y,高32位是x。
在解码(decode)的时候,获得y坐标直接把编码后的数point强制类型转换成int(强制类型转换直接取低32位)。取x坐标要先把point右移32位再强制类型转换获得x坐标。
PS:假如坐标有负数,需要在encode的时候需要在强转后把y的前32位置成0,因为负数int强制类型转换成long long高32位会补1(正数补0,计算机保存的是数的补码,整数的补码跟本身一样,负数的补码要取反+1)增加y &= 0x00000000ffffffff; 把高32
STL平衡树中迭代删除的坑
STL平衡树中迭代删除的坑昨天在map中在使用反向迭代器过程中删除的时候引发一些问题。死循环或者段错误,顾总结一下这个坑
正向遍历删除倘若有一个需求让你在map中操作,按key从小到大遍历,把全部key对应的value值为2的key从map中删除。
先上结论:
// 正确写法
for (auto it = mp.begin(); it != mp.end(); ) {
if (it->second == 2)
mp.erase(it++);
else
it++; // c++11后可以用 it = next(it);
}
// 错误写法
for (auto it = mp.begin(); it != mp.end(); it++) {
if (it->second == 2)
mp.erase(it);
}
对 list 和 vector 来说,它们的 erase 函数会返回下一个迭代器,因此在遍历时,只需要 it = c.erase(it) 即可。
对 map 和 set 来说,它们
洗牌算法及其验证
洗牌分析洗牌算法正确性的准则:产生的结果必须有 n! 种可能,否则就是错误的。这个很好解释,因为一个长度为 n 的数组的全排列就有 n! 种,也就是说打乱结果总共有 n! 种。算法必须能够反映这个事实,才是正确的。
void shuffle(int[] arr) {
int n = arr.length();
for (int i = 0 ; i < n; i++) {
int rand = randInt(i, n - 1); // 从 i 到最后随机选一个元素
swap(arr[i], arr[rand]);
}
}
对于每一个位置来说当前都有n-i种选法,即第0个位置有n中可能(0到n-1有n个数),第二个位置有n-1种可能以此类推。最后就有n!种可能。
验证洗牌算法,或者说随机乱置算法的正确性衡量标准是:对于每种可能的结果出现的概率必须相等,也就是说要足够随机。
蒙特卡罗方法近似地估计出概率是否相等
思想:类似求圆周率打点一样。在正方形纸上画一个直径为正方形边长的圆。随机往上扔石头,然后根据石头落在圆的内和
01BFS求最短路
01BFS求最短路结论
在我以前的理解:当图的所有边权都是1的时候,求一个点到每个点的最短路径就是bfs所经过的点。因为边权是1所以每一层一定是最先到达的点。边权是非负数的时候,最短路就可以使用常见的最短路算法Dijkstra;有负数边的话SPFA等。
但是若边权只有0和1的时候,可以使用01BFS,但是要使用双端队列。扩展某个节点的时候,若边权是0则加入队首,边权是1则加入队尾。这样就可以满足每次扩展的永远是最短的(0在队首可以保证)
178周赛第四题收货:01BFS求最短路
问题可以抽象成构建一个图,每一个方向都可以向其四个方向建边,若需要改变方向则边权是1,若不需要改变方向边权是0。然后找(0, 0)点到(n-1, m-1)的最短路。
代码以这道题为例,因为边权是0或1可以使用01BFS求最短路
每次扩展四个边的时候,边权为0加入队首,边权为1加入队尾
代码:
// 32ms & 18.3MB
class Solution {
public:
int minCost(vector<vector<int>>& grid) {
背包问题总结
背包问题
v为体积, w为价值 v, w > 0
0-1背包dp(i, j) 表示选前i件物品到背包容量为j的最大价值
dp(i, j) = max(dp(i-1, j), dp(i-1, j-v[i]) + w[i])
转移方程解释:选前i件物体的背包容量为j的最大价值由两个状态转移过来: case1: 不选第i件物品,只在前i-1件物品中选最大价值; case2:选第i件物品,那前i-1件物品中只能选j-v[i]容量的价值。
base case:dp(0, 0) = 0选前0件物品到容量为j的最大价值为0
对于每个阶段i,求出对应背包容量[0, V]的最大价值
暴力// 返回选择前i件物品在背包为j容量的最大价值
int dfs(int i, int j) {
if (i == 0) return 0;
int res = dfs(i - 1, j);
if (j - v[i] >= 0) res = max(res, dfs(i - 1, j - v[i]) + w[i]);
return res;
}
记忆化搜索//
DP常见种类
DP常见种类
对于dp数组下标什么时候从1开始, 假如状态中有 i-1转移过来的就最好从1开始. 这样可以给dp[0]初值, 设置边界, 少一些判断
一般解决 最值, 计数, 存在性
时间复杂度: 状态数 转移代价 (定义状态的个数 每个状态计算的代价)
术语 & 满足性质术语
动态规划:运筹学中的一个分支,是求解决策过程最优化的数学方法。
阶段:把所给求解问题的过程恰当地分成若干个相互联系的阶段。
状态:状态表示每个阶段开始面临的自然状况或客观条件。
决策(转移):一个阶段的状态给定以后,从该状态演变到下一阶段某个状态的一种选择称为决策。
策略:每阶段都做一个决策,一系列决策的集合。
边界:初始集合。
满足性质
最优子结构:一个最优化策略的子策略总是最优的,反过来,我们可以通过最优的子策略,推出最优策略。
无后效性:当我们通过一系列策略到达了某一阶段的某一状态时,下一步决策不受之前的一系列策略影响,仅由当前状态决定。
子问题重叠:算法计算的过程中会反复地求解相同的一定量的子问题,而不是不断生成没有见过的新问题。也就是说子问题空间不大,或是状态空间不大,我们可以通过
最短路
最短路
SPFA#include <bits/stdc++.h>
using namespace std;
int n, m;
vector<vector<pair<int, int>>> g; // w id
int spfa(int u) {
vector<int> dist(n + 1, INT_MAX);
vector<bool> used(n + 1, false);
dist[u] = 0;
queue<int> q;
q.push(u);
used[u] = true;
while (!q.empty()) {
int ver = q.front(); q.pop();
used[ver] = false;
for (auto &e : g[ver]) {
int ne = e.second, w = e.first;
i
iOS数据的序列化与存储
JSON解析NSJSONSerialization(系统最底层)
系统最基础的库: NSJSONSerialization 提供JSON数据和系统对象之间的转换(可以相互转换)
// 把收到NSData转成Dictionary的对象
NSError *jsonError;
// change to NSdata to Dictionary
id jsonObj = [NSJSONSerialization JSONObjectWithData:data options:0 error:&jsonError];
开源的解析库
用一个Model来代表Dictionary汇总的数据(Bean)
JSON Model开源项目: YYModel / Mantle / MJExtension
简化NSData - JSON - Model流程
避免类型转换错误 / 属性和对象不一致
相互转换
建议使用开源的项目直接把Dictionary变成一个Model,但是在objectForKey的时候也是需要异常检测的,防止拿不到数据。
JSON:
{
"uid"
iOS网络功能基础总结
App内基本网络流程
NSURL : 封装网络字符串地址
NSURLRequest : 在NSURL的基础上封装一些参数和基础的设置,形成一个请求
NSURLSession : NSURLRequest根据NSURLSession提供的一些方法就可以返回服务器的资源数据
URL & NSURL[协议类型]://[服务器器地址]:[端⼝口号]/[资源层级UNIX⽂文件路路径][⽂文件名]?[查询]#[⽚片段ID]对应:http://root:Password1@example.com*:8042/project/index.dtb?type=animal&name=dog#nose
封装成URL通过正则表达式来匹配对应的参数, 封装成规范化的对象
http网络 / file本地路径
HTTP & NSURLRequest
Get方法:从指定的资源请求数据。 可缓存、长度限制
Post方法:向指定的资源提交要被处理的数据。 不缓存、长度无要求
Http Header:请求和相应的补充信息。 长度、编码类型、压缩方式、事件
把NSURL结合请求的各项需求打包