1

ARTS打卡活动——第二周

1.Algorithm 做一个leetcode的算法题

650.2 Keys Keyboard
Initially on a notepad only one character 'A' is present. You can perform two operations on this notepad for each step:

Copy All: You can copy all the characters present on the notepad (partial copy is not allowed).
Paste: You can paste the characters which are copied last time.

Given a number n. You have to get exactly n 'A' on the notepad by performing the minimum number of steps permitted. Output the minimum number of steps to get n 'A'.
Example 1:

Input: 3
Output: 3
Explanation:
Intitally, we have one character 'A'.
In step 1, we use Copy All operation.
In step 2, we use Paste operation to get 'AA'.
In step 3, we use Paste operation to get 'AAA'.

Note:
1.The n will be in the range [1, 1000].


解答:这道题我采用的是动态规划思想,已知n和它所有的正整数因子x,有

$$ f(n)=\min \left(f\left(x_{i}\right) + \frac{n}{x_{i}}\right) $$

分析:

  1. 要得到n个A,最后一批操作总是这样的:先构造出x个A出来,然后执行第一个操作(全部复制),紧接着是y-1个拷贝,总的操作次数是f(x)+1+y-1=f(x)+y
  2. 显然,x*y=n,因此,只要把所有的x、y对找出来,计算每一对的步骤数,取最小的作为f(n)的最终结果;

代码如下:

class Solution {
public:
    int minSteps(int n) {
        res[1] = 0;
        res[2] = 2;
        res[3] = 3;
        if (n < 4 || res[n] > 0)
            return res[n];
        int min = n;
        for (int i = 2; i <= n / 2; i++) {
            if (n % i == 0) {
                int temp = minSteps(i) + n / i;
                if (min > temp) {
                    min = temp;
                }
            }
        }
        res[n] = min;
        return min;
    }

private:
    int res[1001] = {0};
};

2.Review 阅读并点评至少一篇英文技术文章

这周阅读了一篇比较有意思的技术文章,I’m a Computer Scientist. Here’s Why You Should Never Trust a Computer.,作者Ryan North认为计算机很不安全,在一些关键的场景中,不能完全相信计算机,尤其是投票。
阅读这篇文章之前,我也清楚计算机确实不能完全相信,因为容易被黑客入侵,篡改数据。然而,我认为黑客就是入侵你的系统,注入一些木马或者得到系统的管理权限,从而达到他们要实现的目的。而这篇文章提到的不安全,是从编译代码的阶段入手:在编译器里面注入后门代码,用户只要用你的编译器编译代码,就会在生成正常的机器代码同时,也会生成后门代码,而且编译器稍作修改,还能实现自我复制。因此,用户是很难看得出这些“邪恶”的代码,除非看二进制形式,显然这很不现实。
在错综复杂的软件世界里,我们能够相信哪段源码呢?正如 Ken Thompson 所说,我们也许只能相信写代码的人了。

3.Tip 学习至少一个技术技巧

大家在写web服务时,往往习惯的把服务的一些配置(包括数据库地址、RPC调用接口、redis地址等)写在项目文件里面,比如resource/config.property,但是当这个web服务需要部署到不同的生成环境时,麻烦的事情就来了,每次都需要把项目包里面的config文件的配置修改成当前的环境,对于运维人员很不方便。
有一种技巧可以缓解这个问题:

  1. 将配置信息写在项目包以外的固定位置,比如/home/etc/xxx.property;
  2. 不同的环境用不同的region表示,相应的region信息可以写在项目包以外的固定位置,比如/home/etc/meta.conf;
  3. /home/etc/xxx.property里面罗列所有region的配置信息,一旦有新的region加入,直接在文件后面追加;
  4. /home/etc/xxx.property的维护可以采用svn定期同步或者zookeeper来同步;
  5. 运维人员只需要关心服务器region的配置。

4.Share 分享一篇有观点和思考的技术文章

结合第2点的那篇文章,我查了下如何具体实现在编译器中留后门的操作,于是找到了以下这篇文章,里面讲述的技术细节还挺不错的。
给开源编译器插入后门


Lincoln
1 声望0 粉丝

IT领域的迷途小羔羊,曾经荒废了不少时光,但坚信活到老学到老,对以前丢弃过的知识,重新捡起来,知其然,更需知其所以然