ARST打卡第237周[237/521]

Algorithm

lc2342_数位和相等数对的最大和

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
class Solution {
public:
int getBitSum(int num) {
int bitSum = 0;
while (num) {
bitSum += num % 10;
num /= 10;
}
return bitSum;
}
int maximumSum(vector<int>& nums) {
// 本来想看看数位和定义,看tips,结果tips把思路全说了,尴尬
// 那就快速实现吧
// 枚举数据和对最大两个值的hash,然后最终获取结果
// 优化思路: AC之后看别人的提交发现如果在第一种for里面就ans维护最大ans.
// 数据结构可以退化为 unordered_map<int, int> 后面保存每次的max_num
// 每次直接维护ans即可
unordered_map<int, pair<int, int>> bitSum2max;
for (auto& num : nums) {
int bitSum = getBitSum(num);
if (bitSum2max.find(bitSum) == bitSum2max.end()) {
bitSum2max[bitSum].first = num;
continue;
}
if (bitSum2max[bitSum].second == 0) {
// 升序排列. 小的放 first, 大的放 second
if (num < bitSum2max[bitSum].first) {
swap(num, bitSum2max[bitSum].first);
}
bitSum2max[bitSum].second = num;
continue;
}
if (num <= bitSum2max[bitSum].first) {
continue;
} else if (num <= bitSum2max[bitSum].second) {
swap(num, bitSum2max[bitSum].first);
} else {
// 先替换第二个,再把第二个替换掉第一个
swap(num, bitSum2max[bitSum].second);
swap(num, bitSum2max[bitSum].first);
}
}
int ans = -1;
for (const auto& it : bitSum2max) {
if (it.second.first && it.second.second) {
ans = max(ans, it.second.first + it.second.second);
}
}
return ans;
}
};

这个题花了40分钟,速度还是慢了,还得多练练。

Review

Iterator Implementation

Iterator 通过良好的组合,把简洁留给客户,把复杂留给自己,而且通过简单的关系组合,构建了美妙的实现。

其实看每一块都觉得很简单简洁,但组合在一起,就感觉很美妙复杂。

记得高中化学老师常说: 世上无难题,只有组合题。

所以当我们肢解了每一个小块,那么就能发现组合在一起的复杂事务其实也很简单精妙了。

Tips

推荐微信读书灰度测试的读书打卡活动:

  1. 每天5分钟,365天只需要打卡360天即可,所以有5天冗余,也不要求连续阅读,基本不会翻车.
  2. 价格实惠,只要50元RMB就能立马获得1个月的阅读会员,然后完成挑战之后直接送1年的阅读会员,很香。

下面链接需要微信中打开:
https://weread.qq.com/misc/read-challenge

Share-开发临时备份代码思考,私人分支备份,整理好再push工作分支

因为 rebase 容易毁掉整个远程分支,所以不能直接推到远程工作分支,防止影响他人。

但是如果一个 feature 的代码一直放在本地,又怕数据丢失,这样会导致极大的风险。

一个个 temp commit 推到远程,之后 git reset 很长的提交链条整理再强推,其实好像和 rebase 强推差不多…

所以这里想到的就是在远程建立一个私人分支,方便仅用于用于备份 temp commit

之后 git rebase 整理好推到工作分支,顺便强推到备份私人分支。