Contents

ARST打卡第285周

lc3192_使二进制数组全部等于1的最少操作次数II 【TED演讲】世界是好还是坏?《金字塔原理》 最佳实践_子库作为目录保留历史合入主库

Algorithm

lc3192_使二进制数组全部等于 1 的最少操作次数 II

思路:

因为前面的0必须都要变成1,并且前面不被后面影响,所以可以贪心从前向后遍历。

记录翻转次数,来确定当前遍历的 nums[i] 是否需要翻转。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
impl Solution {
    pub fn min_operations(nums: Vec<i32>) -> i32 {
        let mut ans = 0;
        for i in 0..nums.len() {
            // 奇数次翻转,后面的值是翻转了的, 遇到1翻转
            if (ans & 1) == 1 && nums[i] == 1 {
                ans += 1;
                continue;
            } 
            // 偶数次翻转,后面的值是没翻转的, 遇到0翻转
            if (ans & 1) == 0 && nums[i] == 0 { 
                ans += 1;
                continue;
            }
        }
        ans
    }
}

题解把这个优化成了 nums[i] == (ans % 2) 的情况 ans += 1, 然后dp方法有点舍近求远,不过感兴趣也能去了解。

Review

【TED演讲】世界是好还是坏?

演讲者用了很多的30年前后的数据对比,证明世界其实是越来越好的。

之所以人们感觉变差了,是因为:

  • 人脑神经倾向于美化过去的记忆
  • 新闻行业倾向于报道坏事才能吸引眼球
  • 人们倾向于认为世界变坏了,这样消极避世,不再进取

通过真实的数据,可以知道世界在变好,人们也能通过努力去获取更好的生活。

所以在兼顾人生体验的同时,做点积极的事情,总是好的。

Tips

《金字塔原理》

Share最佳实践_子库作为目录保留历史合入主库

1. 子库保留部分历史

以 rocksdb 为例,让开源提交全都合并成一个提交,然后保留自己的修改历史。

  • git checkout -b simple-history 开一个新分支。
  • 在新分支里面先git reset --hard删除到rocksdb 源码引入的位置 (也就是自己的第一次修改代码的前一个位置),
  • 然后 git reset --soft 回到第一个commit提交位置,再 git add -Agit commit --amend 合并成一个提交。
  • 然后 git cherry-pick 老分支,选择自己以前的所有的提交 (也可以选择想要的提交)。

所以可以迭代进化成这样:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
git checkout simple-history
# 回退到 6.29.fb 的引入时最终提交位置, 到时候再cp回 自己的rocksdb 修改
git reset --hard 79f08d7ffa6d34d9ca3357777bcb335884a56cfb
# 回退到 54f1fd7eef101db1dfb2bb66a59083c45a38aa4a 的最开始提交位置, 并重新设置 commit
git reset --soft 54f1fd7eef101db1dfb2bb66a59083c45a38aa4a
git add -A
git cm --amend 

# 然后 cherry-pick 选择想要的提交 (可能要解决冲突)
git cherry-pick 7dd878f6f039cf29c2ede8485f7f331955ee9ae0..40fcf9ddf70c1ea3035cda2557513bce7119658a

2. 子库复制到子目录

这里主要是子库不能直接 merge 到主库的根目录,一般需要放在 third-party 目录下。 所以这里就得子库先自己把自己放到 third-party 目录下。

1
2
3
4
5
# 方法一: 可能会报错,则方法二
mkdir third-party/rocksdb
shopt -s extglob
mv !(third-party/rocksdb) third-party/rocksdb
# mv: cannot stat ‘!(third-party/rocksdb)’: No such file or directory
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
# 方法二
mkdir third-party/rocksdb
# 变通的移动
find . -maxdepth 1 ! -name 'third-party' ! -name 'rocksdb' ! -name '.' -exec mv {} third-party/rocksdb \;
cd third-party/rocksdb
mkdir -p third-party && cp -r ../folly ../gcc ../gtest-1.8.1 third-party/

cd .. &&rm -rf folly/ gcc/ gtest-1.8.1/

cd rocksdb && mv .git ../.. && cd ../..

git cm -a -m "[update] mv 子库合并到 third-party/rocksdb中"

3. 主库删除原来的子库submodule

1
2
3
cd /home/slm/code/FatherProject
git rm --cached third-party/rocksdb
git cm -m "[update] 删除rocksdb6.29.fb的submodule改成目录集成"

4. 主库添加子库

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14

cd /home/slm/code/FatherProject
git remote add tmp /home/slm/code/rocksdb
git fetch tmp
git merge tmp/tmp/rdb6.29.fb.test
git merge tmp/rdb6.29.fb.test  --allow-unrelated-histories

git remote rm tmp

# 这里已经可以看到子库的log也合入主库了
git log

# 提交
git push