Contents

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 整理好推到工作分支,顺便强推到备份私人分支。