0%

给定一个无序的整数数组,找到其中最长上升子序列的长度。

示例:

输入: [10,9,2,5,3,7,101,18]
输出: 4
解释: 最长的上升子序列是 [2,3,7,101],它的长度是 4

这道题目的关键是找到切入点,$dp(i)$ 指的是以第 i 个元素结尾的最长递增序列, 用数学公式表示如下:

表1 模拟

i 0 1 2 3 4 5 6 7
nums[i] 10 9 2 5 3 7 101 18
dp(i) 1 1 1 2 2 3 4 4

代码如下:

func lengthOfLIS(nums []int) int {
l := len(nums)
if l == 0 {
return 0
}
dp := make([]int, l)
// initial dp array default 1
for i := 0; i < l; i++ {
dp[i] = 1
}

res := 1
for i := 0; i < l; i++ {

for j := i - 1; j >= 0; j-- {
if nums[j] < nums[i] {
dp[i] = max(dp[i], 1 + dp[j])
}
}
res = max(res, dp[i])
}
return res
}

func max(a, b int) int {
if a > b {
return a
} else {
return b
}
}

Coin Change 题目

给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。

解题思路

条件:

  1. 有多种面额
  2. 每种面额数量不限
  3. 输出凑成面额的最少硬币个数
  4. 没有可能输出 -1

如有 [1, 2, 5] 三种面额,总金额 amount 为 11,答案为 3 既 11 = 5 + 5 + 1

比如你想求 amount = 11 时的最少硬币数(原问题),如果知道凑出 amount = 10 的最少硬币数(子问题),只需要把子问题的答案加一(再选一枚面值为 1 的硬币))就是原问题的答案,因为硬币的数量是没有限制的,子问题之间没有相互制,是互相独立的。这类子问题又称为最优子结构。

func coinChange(coins []int, amount int) int {
cache := make(map[int]int)
return dp(coins, amount, cache)
}

func dp(coins []int, amount int, cache map[int]int) int {
if n, ok := cache[amount]; ok {
return n
}
if amount == 0 {
return 0
}
if amount < 0 {
return -1
}
res := math.MaxInt8
for _, coin := range coins {
sub := dp(coins, amount-coin, cache)
if sub == -1 {
continue
}
res = min(res, 1+sub)
}
if res != math.MaxInt8 {
cache[amount] = res
} else {
cache[amount] = -1
}
return cache[amount]
}

func min(a, b int) int {
if a < b {
return a
}
return b
}

For the past 33 years, I’ve looked in the mirror every morning and asked myself: “If today were the last day of my life, would I want to do what I am about to do today?” And whenever the answer has been “No” for too many days in a row, I know I need to change something.

在过去的 33 年,我每天早上都对着镜子问自己:“如果今天是生命的最后一天,我会做我准备要做的事情吗?”。每当我连续太多天都得到“不”的答案时,我就知道我必须有所改变了。

Remembering that I’ll be dead soon is the most important tool I’ve encountered to help me make the big choices in life. Because almost everything — all external expectations, all pride, all fear of embarrassment or failure — these things just fall away in the face of death, leaving only what is truly important.

提醒自己快死了,是我人生中下重大决定时所用过的最重要的方法。因为几乎每件事 — 所有的外界期望、所有名誉、所有对困窘或失败的恐惧 — 在面对死亡时,都消失了,只有最重要的东西才会留下。

Remembering that you are going to die is the beat way I know to avoid the trap of thinking you have something to lose. You are already naked. There is no reason not to follow your heart.

提醒自己快死了,是我所知避免掉入自己有东西要失去了的陷阱里最好的方法。人生不带来,死不带去,没什么道理不顺心而为。

About a year ago I was diagnosed with cancer. I had a scan at 7:30 in the morning, ant it clearly showed a tumor on my pancreas. I did not even know what a pancreas was. The doctors told me this was almost certainly a type of cancer that is incurable, and that I should expect to live no longer than three to six months.

一年前,我被诊断出癌症。我再早上 7:30 作了身体扫描,我的胰脏清楚的长了一个肿瘤。可我连胰脏是什么都不知道。医生告诉我,那几乎可以确定是一种不治之症,我大概只能活三到六个月了。

My doctor advised me to go home and get my affairs in order, which is doctor’s code for prepare to die. It means to try and tell your kids everything. You thought you’d have the next 10 years to tell them in just a few months. It means to make sure everything is buttoned up so that it will be as easy as possible for your family.

医生建议我回家,好好处理后事,这是医生对临终病人的标准建议。那代表你得试着在几个月内把你将来十年想跟小孩讲的话讲完。那代表你得把每件事情都搞定,家人才会尽量轻松。

It means to say your goodbyes.

那代表你得跟所有人说再见了。

创建数据库

CREATE DATABASE finance CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;

创建用户

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
CREATE USER 'username'@'%' IDENTIFIED BY 'password';

更改用户权限

GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;
GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION;

取消用户权限

REVOKE ALL PRIVILEGES ON *.* FROM 'username'@'localhost';
REVOKE ALL PRIVILEGES ON *.* FROM 'username'@'%';

刷新权限

FLUSH PRIVILEGES;

每次重新部署 Nginx 总会遇到 Nginx 403 Forbidden 这个错误,这里列一个排除此类错误的清单。

  1. 确认 Nginx 正常启动,这里要记录启动 Nginx 的用户供后续步骤使用,通常是 nginx

    $ ps -ef | grep nginx | grep -v grep

    root 1714 1 0 14:27 ? 00:00:00 nginx: master process /usr/sbin/nginx
    nginx 1973 1714 0 14:45 ? 00:00:00 nginx: worker process
  2. 确认 Nginx 的初始配置 /etc/nginx/nginx.conf 正确,特别注意 rootindex

    $ cat /etc/nginx/nginx.conf

    ...
    server {
    listen 80;
    listen [::]:80;
    server_name _;
    root /srv/zhongyiio/;

    location / {
    index index.html;
    }
    }
    ...

    $ sudo nginx -t # 如果不是以下结果,需要根据报错修改语法错误

    nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
    nginx: configuration file /etc/nginx/nginx.conf test is successful
  3. 确认网站静态目录权限,一般情况文件夹 755、文件 644 就行,用户和用户组和步骤 1 保持一致,这里为 nginx。

    $ ls -la /srv/zhongyiio

    total 44
    drwxr-xr-x. 11 nginx nginx 235 Nov 13 08:27 .
    drwxr-xr-x. 3 root root 23 Nov 14 14:14 ..
    drw-r--r--. 5 nginx nginx 36 Nov 13 08:27 2017
    -rw-r--r--. 1 nginx nginx 10 Nov 13 08:27 CNAME
    drw-r--r--. 3 nginx nginx 36 Nov 13 08:27 archives
    -rw-r--r--. 1 nginx nginx 18197 Nov 13 08:27 atom.xml
    -rw-r--r--. 1 nginx nginx 1785 Nov 13 08:27 baidusitemap.xml
    drw-r--r--. 4 nginx nginx 32 Nov 13 08:27 categories
    drw-r--r--. 2 nginx nginx 44 Nov 13 08:27 css
    -rw-r--r--. 1 nginx nginx 1150 Nov 13 08:27 favicon.ico
    drw-r--r--. 2 nginx nginx 70 Nov 13 08:27 img
    -rw-r--r--. 1 nginx nginx 5164 Nov 13 08:27 index.html
    drw-r--r--. 2 nginx nginx 23 Nov 13 08:27 js
    drw-r--r--. 2 nginx nginx 24 Nov 13 08:27 reading
    -rw-r--r--. 1 nginx nginx 922 Nov 13 08:27 sitemap.xml
    drw-r--r--. 3 nginx nginx 23 Nov 13 08:27 tags
    drw-r--r--. 2 nginx nginx 24 Nov 13 08:27 talking
  4. 确认 SELinux 是否开启,不建议关闭 SELinux

    $ sestatus

    SELinux status: enabled
    SELinuxfs mount: /sys/fs/selinux
    SELinux root directory: /etc/selinux
    Loaded policy name: targeted
    Current mode: enforcing
    Mode from config file: enforcing
    Policy MLS status: enabled
    Policy deny_unknown status: allowed
    Max kernel policy version: 28

    # 如果状态为 enabled 使用该命令,确保之后建立的文件和复制的文件具有
    # 相同 httpd_sys_content_t 的类型,从而使受限的 httpd 进程能够访问
    $ sudo chcon -R -t httpd_sys_content_t /srv/zhongyiio/

如果你能保持冷静,当你身边的人们都变得疯狂,纷纷指责你;

如果你能相信自己,当所有人怀疑你,但且让他们怀疑去吧;

如果你遭等待,却不因等待疲倦,或者遭受欺骗,却不用谎言回敬,或者遭到憎恨,却不用憎恨反击,能够不得意忘形,也能够不巧言令色;

如果你能与凡人交谈,且彬彬有礼,或与国王同行,而不奴颜婢膝;

如果仇敌和密友都无法伤害你,如果你在乎每个人,但不会缺了谁都不行;

如果你在想发泄愤怒的那一分钟去进行六十秒的跑步,大地以及大地上的万物都属于你,而更重要的是,你将是真正的男人,我的孩子!

—- 摘自《如果》

截止写这篇文章来北京已经 2 年零 8 个月了,说说这段时间的感受。

2014 年 7 月 1 日我怀揣着梦想来到北京,迷茫但又憧憬着,一路走来也算磕磕碰碰。一直以来我都认为自己与众不同,不想按部就班走别人走过的路。在职业生涯的起步阶段我想尝试更多的自己,不为自己设定任何界限,我要一直告诉自己“Yes,I can do it.”。

我在四三九九

这是我第一段工作经历,我加入了挣钱最多也最幸苦的手游行业,我把这里定义为职业生涯的开始。

在这家公司我认识了敬坤(老大)、铎哥(师傅)、云飞(老乡)、高峰(好友)等等。在这里我开始学习使用 Erlang 语言开发服务器后端程序。

我是一个非常愿意为喜欢的东西付出努力的人,为了学习 Erlang 语言我从网上罗列许多优秀的资料和官方的文档打印成纸质版本随身携带,甚至有一段时间连上厕所都拿一本啃着,为了学习 Vim(编辑器之神),我适用了许多优秀的配置,翻看了无数的技术博客和书籍,等等。就这样埋头苦干了快一年也基本能胜任这份工作,同期游戏也上线了还取得了不错的成绩,本来信心满满的投入到新游戏的制作,不知为何团队莫名其妙就解散了,短短数日同事们走了一大半。后来才知道是项目经理带着团队离开了(看来我还是没有成长为核心成员)。

这时大概是 2015 年 6 月左右,开发任务基本终止了,每天就做一些维护的工作和玩游戏,这样一直持续到 8月份我开始决定离开了,大概是 9 月份的时候云飞说 “有一个小团队需要后端程序员,你有兴趣没有,工资福利都好说?”,我说 “可以啊,反正我是不想这样闲着了。”。就这样我提出了离职申请并开始学习 Node(下一个项目使用的语言),离职被一直拖到 10 月份的时候终于满一个月离职加入新团队。在这里学到了许多有价值的技术和一些获取技术的途径(比如 GitHub),我自己也能够独立的解决遇到的技术问题了。

第二段工作经历大概2个月,就是上边提到的游戏创业团队,我们加入时大概10个人左右,然后就风风火火的投入战斗了,到12月份的时候游戏雏型已经完成,可惜生不逢时啊,投资人撤资了。于是这段经历就这样 Game Over 了。

非常非常感谢曾帮助过我的那些同事们,也祝他们在新的团队实现自己的价值。

我在普林

第三段工作经历,也是我目前在职的公司普林科技,于 2016 年 1 月 4 日加入公司。

在游戏行业待了 1 年多,发现自己的兴趣并不在此,心里一直认为人工智能、大数据和云计算才是真正牛逼的技术,这也是选择普林的原因。

在这里有一种找到了组织的感觉,反正就是状态莫名的好。涛哥(老大)对我很信任,安排我负责好几个项目的工作和一些面试的工作(感觉受宠若惊),当然为了回馈这份信任我投入了100%的热情。同事们也好优秀,什么 “博士后、博士、北大、北航”,看来我只有更努力、更努力和更努力奔跑才能赶的上他们的步伐了。

事情到这里本该是 “公司蒸蒸日上,我做着自己喜欢的事情”。然而现实永远都不像我想的那么简单,有时候觉得自己还是 “too young, too naive”。公司经历了许多状况 “换帅、直属领导离职、COO离职和同期进入公司的同事离职等等”,我能清楚的感受到公司文化的变化,这一切归根结底是公司发展的并不顺利。所以当你决定加入一家创业公司的时候,一定不要给自己太美好的心里预期。也许有人会说这很正常,创业的各个阶段一定会经历许多,我一定认同他的观点。在实际中,我也在不断的调整自己的定位来适应公司,偶尔也会抱怨但大多数时候还在努力坚持。

最终还是决定离开了,心态也很平和,只是觉得这里不太适合我未来的发展了,我决定换个环境继续前行。在普林这一年我学到许多东西,不仅仅是技能的提升,学会了思考、学会了为人处世。我非常感谢普林每一位共事的同事,从你们身上学到了许多宝贵的经验,最最感谢的是我的两任领导涛哥和志国。相信我们只是缘尽于普林,他日还会聚在一起。

下一站 ofo

共享经济是时下最热门的创业领域,虽然本质还是商业还是以赚钱为目的,但我非常认可共享经济带来的变化,也相信它能改变世界。

就如我即将加入的 ofo,以解决最后 1 公里为目标,方便了成千上万人的出行。这才是真正意义的创业,相信在这里会收获不少。

下一站 advance.ai

人生之所以好玩是因为我们无法判断接下来会发生什么,我最终还是放弃了 ofo 的邀请选择加入 advance.ai。

如果非要给出一个解释,那可能是下面这几个点打动了我:

  • 直属领导很给力,在接下来的职业生涯会帮助我更快的成长。
  • 感受到了尊重,我相信一家懂得如何尊重员工的公司会走的更远。

我希望自己不忘初衷,努力学习、努力工作、努力生活。