如何迈出第一步

在算法前5课结束后,我渐渐的明白了一个道理:不管前方多难,放手去做吧,最难的是迈出第一步,迈出去了,以后就掌控在你手中了。快排、最短路径、二叉树算是算法的基础内容,但是之前一直不敢下手把他们写出来,因为工作3年多了,都是在创业公司,重重的业务负担让人满脑子充斥的都是业务逻辑、UI界面,5年前学的东西都忘的干净,所以我不假思索的在日程中加入了写算法文章,并且马上买了一本算法的书。然后逼着自己写了开篇之后,发现每天上午上班,先放开手中的工作,安静的读书、实践代码、写出来自己的思想并分享给大家是一件很不错的事情,而且渐渐的觉得重新拾起了算法。其实我买的书的内容,就是讲解到了二叉树就完结了,我大概用了4天的时间读完了这本书。

然后就是今天所写的react-native,其实在RN刚出的时候,我就开始入手了(忠实的FaceBook技术粉),但是一直在给自己找理由不去实践,每次版本更新,也只是去官网看看例子,觉得理解就行了。这段时间有朋友问到我相关的东西,我发现,在实际动手的时候,我就写个登录界面都写的不是很得心应手。所以决定迈出写项目的第一步。那,又有人要问了,写什么项目呢?先别急,既然是迈出第一步,那就要慢慢来。我姑且当读者都熟悉HTML、CSS、JS。

查看更多

评论

算法第五课

什么是树,没有回路的就是树,有回路的就是图。树有很多特性:

  1. 树中的任意两个点有且仅有唯一的一条路
  2. 树中如果有n个点,那么它一定恰好有n-1条边
  3. 在树中任意两点之间加一条,就会构成回路

常见的树,有家谱、操作系统的文件夹,目录等。并且我们规定,只要是没有回路的连通无向图就是树。为了确定每一棵树的形态,我们在对一棵树进行讨论的时候,将树中每个点称为结点或者节点,在树中,我们可以指定一个特殊的节点-。有一个根的树叫做有根树。根又叫做根节点,一棵树有且仅有一个根节点。根节点又可以被称为祖先,接下来就是父节点(没有父节点的节点就是根),子节点。如果一个节点没有子节点,这个节点被称为叶节点。如果一个节点既不是根节点也不是叶节点,也可以被称为内部节点,每个节点有深度,深度指的是从根到这个节点的层数(根为第一层)。

查看更多

评论

算法第四课

深度和广度是什么

为什么叫做深度与广度优先呢,其实是针对图的遍历而言的,请看

使用深度优先来便利这个图(具体什么是图,可以去搜索一下图论中关于图的定义)的具体过程是,假设从左边的顶点开始,沿着当前定点的边,走到未访问过的顶点;当没有未访问过的顶点时,返回到上一个点,继续试探别的点(沿着某一条分支走到底,然后回朔,再沿着另一条进行同样的操作)。所有的顶点都走过了或者是提前符合我们的条件,遍历结束。

广度优先的思想是:首先以一个未被访问过的顶点作为起始顶点,访问其所有相邻的顶点,然后对每个相邻的定点,再访问他们相邻的未被访问过的点定点,直到所有的点都被访问或者提前符合我们的条件,遍历结束。

查看更多

评论

算法第三课

枚举

枚举算法又被称为穷举算法,字面看很暴力,先来看一个例子:

1
口口口+口口口=口口口?

3位数与3位数相加等于一个3位数(使用1~9,不能重复),用穷举来说,就是列举所有的可能。这样写for循环的话,我们要写9个循环嵌套(9个数字,每个都要循环),然后通过一大串的判断语句之后,才能得到我们的答案(答案还需要除以2,173+286与286+173是一样的),有兴趣或者有时间的同学可以用穷举的思想试一下。

查看更多

评论

算法第二课

栈、队列、链表

队列

先进先出,前面出,后面进。队列分列表头,列表尾。使用2个位置标记量分别代表首、尾,当首=尾,标识队列为空队列。每当入数据,尾++,出数据,头++:

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
26
27
28
29
30
struct list {
int data[1000];
int head;
int tail;
};
int main(int argc, const char * argv[]) {
struct list list;
// 初始化列表首、尾
list.head = 1;
list.tail = 1;
// 读入数据
for (int i = 1; i <= 5; i ++) {
scanf("%d", &list.data[i]);
list.tail ++;
}
printf("list headNum: %d, tailNum: %d\n", list.data[list.head], list.data[list.tail - 1]);
// 模拟出一个值
list.head ++;
printf("list headNum: %d, tailNum: %d\n", list.data[list.head], list.data[list.tail - 1]);
// 模拟入一个值
list.data[list.tail] = 10;
list.tail ++;
printf("list headNum: %d, tailNum: %d\n", list.data[list.head], list.data[list.tail - 1]);
}

先进后出,只能后边进,从后边出。栈只有栈顶。使用一个数字标记栈顶,入栈,栈顶++,出栈,栈顶—:

查看更多

评论

使用yarn制作npm包

环境

MAC OSX

工具:Yarn (npm install yarnpkg -g),git

创建你的第一个NPM库

在创建你的第一个库之前,你需要了解什么是yarn。

打开终端,首先创建一个git仓库

1
git init RockSocket

进入RockSocket文件夹,执行:

1
yarn init

这将会询问你以下几个问题:

查看更多

评论

算法开篇课

算法开篇介绍:Algorithm,是指解题方案的准确而完整的描述,代表着用系统的方法描述解决问题的策略机制。

最快最简单的排序

首先看题:

班上有5位同学,分别考了5分,3分,5分,8分,2分,将分数从大到小排序是8,5,5,3,2。有什么好的办法可以编写一段程序,让计算机随机读入5个分数然后将这5个分数从大到小输出。老道的程序员可能各种冒泡,打擂台,这都比较深入了,先往下看:

我们借助一个一维数组就可以解决这个问题,创建一个a[11]的数组,这样下标分别为a[0]->a[10],分别表示0分,1分…10分,每当有一个分数出现,就在对应的下标位置+1,最后打印即可满足我们现在的要求。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
int main(int argc, const char * argv[]) {
int a[11];
int scannedNumber;
for (int i = 0; i < 11; i ++) {
a[i] = 0;
}
for (int j = 0; j < 5; j ++) {
scanf("%d", &scannedNumber);
a[scannedNumber] ++;
}
for (int k = 10; k >= 0; k --) {
for (int l = 0; l < a[k]; l ++) {
printf("%d", k);
}
}
return 0;
}

这种排序算法,我们称为桶排序,每个分数都好比一个桶,每出现一次,就在桶中加一点东西。接下来,我们尝试着对数据范围在0~100之间的任意数量数字进行从大到小的排序:

查看更多

评论

上传Library到JCenter

确定要上传的Library

如果你有Library可以忽略此步骤,没有的话添加library。在Android Studio中选择File->New->New Module,然后选择一个Library,新建一个Library。这里以新建DemoLibrary为例子。(注意这里的Library需要后面的Package的名字一致)。新建一个Library

查看更多

评论

一些App动态化解决方案

文章持续更新

App动态化解决方案,说白了就是后台可以控制或更改App的行为。一些常见的做法如:

  1. App启动请求配置文件,配置文件中存放着一系列的参数,供App配置
  2. 使用一些第三方SDK提供的动态参数(跟第一种类似)
  3. 使用App触发与Socket的长连接,时时的调配或者修改应用程序信息
  4. 使用HTML

使用HTML作为动态界面的App我们又称为Hybrid App(混合性App),是指介于web-appnative-app这两者之间的app,兼具“Native App良好用户交互体验的优势”和“Web App跨平台开发的优势”。现在有半数以上的App都可以被称为这种类型的App。

热修复

程序出BUG了,服务端通过程序启动的配置文件或者Socket链接向App下发一段代码进行修复,业界出名的JSPatch使用范围极广。只需配置一段JS代码即可达到运行时替换或者增加方法等操作。是作为热修复的极好选择。还有一些热修复的方案就是通过HTML来替换当前的原生界面,这样的App通常是组件化App,所有界面的打开均通过服务器获取的Map进行路由,服务器只需动态的更新这张Map,替换到出问题的界面即可。但是这种方法仅仅对界面有用,如果某一类的功能出了问题,就无用了(App还是以界面为主的,BUG也多发生与界面,当然高级的BUG略过了)。

查看更多

评论

Swift语法熟悉(四)

上期提到了使用Moya作为网络基础模块,但是涉及到了一个sampleData的问题,我们也是即时的提交了一个issue来质问这样的默认Response data为什么类型竟然是Optional的。Moya的开发者举例:可以将上一次获取到的数据在需要的时候(网络请求失败)传入这里,所以进而给出建议:将var sampleData改为var cachePolicy进行缓存控制即可,缓存过期的时间由Server端使用Cache-control或Expires决定,目前有的回复是,作者觉得这个建议很棒,说不定有机会为Moya加入缓存机制。接下来继续我们的开发计划:

推送服务

应当明确的是,每家公司用的推送第三方都是不同的(大部分是阿里云、极光、个推),所以继承第三方SDK这个事情不应该出现在框架中。框架仅仅负责申请推送能力即可。测试:在测试之前,Info.plist中所需要申请权限的Key需要自己手动配置。Xcode 8 后打开推送需要在程序中打开选项:

查看更多

评论