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 -A
和 git 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
|