ARST打卡第199周[199/521]

Algorithm

lc1255_得分最高的单词集合

思路:
不愧是hard,问题有点复杂,先想想暴力朴素怎么做

通过直接使用letters去拼凑所有的字母,也就是把单词抽象成一个map字母对出现次数的映射,然后根据字母得分得出所有的单词优先级。然后根据有限的单词,去选择(主要的难点是选择,暂时不知道怎么抽象成一次次迭代选择,好像每次都需要全量考虑一样)

学习一下题解的思路

发现题解没有转化成迭代选择,而就是做的全量选择,用状态压缩然后枚举,因为单词的数量最多只有14个…

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
class Solution {
public:
int maxScoreWords(vector<string>& words, vector<char>& letters, vector<int>& score) {
int n = words.size(), res = 0;
vector<int> count(26);
for (auto c : letters) {
count[c - 'a']++;
}
for (int s = 1; s < (1 << n); s++) {
vector<int> wordCount(26); // 统计子集 s 所有单词的字母数目
for (int k = 0; k < n; k++) {
if ((s & (1 << k)) == 0) { // words[k] 不在子集 s 中
continue;
}
for (auto c : words[k]) {
wordCount[c - 'a']++;
}
}
bool ok = true; // 判断子集 s 是否合法
int sum = 0; // 保存子集 s 的得分
for (int i = 0; i < 26; i++) {
sum += score[i] * wordCount[i];
ok = ok && (wordCount[i] <= count[i]);
}
if (ok) {
res = max(res, sum);
}
}
return res;
}
};

Review

【TED演讲】科技是否改变了我们的是非观

很多观点都是时代的产物,工业时代发展,让社会更容易废除掉奴隶制,网络时代的发展,让我们能更加看到多元文化,从而思考理解包容多元文化

Tips

深入详解Go的channel底层实现原理

Share-不用共享内存来通信,而用通信来共享内存的思考探索

go之所以不用共享内存来通信,而用通信来共享内存,是因为其协程之间都在一个进程里面,那么管道的读取性能就很好。

而如果是进程间的通信,很有可能会出现高性能进程间管道性能还是远不如共享内存的情况出现。

因此和分布式存储中常用的用共享内存来代替rpc调用优化通信效率刚好是相反的。

扩展阅读:

如何理解 Golang 中“不要通过共享内存来通信,而应该通过通信来共享内存”? - 卢旺杉的回答 - 知乎
https://www.zhihu.com/question/58004055/answer/155316307

深度|字节跳动微服务架构体系演进
谈到微服务,由于缺乏直观感受,很多人往往只关注服务的功能层面,而忽略底层的运维属性。但其实现在为什么社区还在不断讨论微服务,因为它部署在公有云、私有云、混合云等充满不确定性的环境下,解决的是由此带来的各种复杂性问题。
但换个角度看,如果开发人员都使用同一种语言,不做跨机器和跨进程的通讯。当所有服务都部署在同一台宿主机上,类似跨网络通讯、请求超时等问题会大大减少,通过共享内存或是无序列化等手段,整体性能似乎可以获得最极致的提升