ARTS Week 05
Algorithm
题目
771. 宝石与石头
给定字符串J 代表石头中宝石的类型,和字符串 S代表你拥有的石头。 S 中每个字符代表了一种你拥有的石头的类型,你想知道你拥有的石头中有多少是宝石。
J 中的字母不重复,J 和 S中的所有字符都是字母。字母区分大小写,因此"a"和"A"是不同类型的石头。
示例 1:
输入: J = "aA", S = "aAAbbbb"
输出: 3
示例 2:
输入: J = "z", S = "ZZ"
输出: 0
注意:
S 和 J 最多含有50个字母。
J 中的字符不重复。
思路
主要在于现根据J生成键值对,使用字符的ASCII码作为key,从而遍历S时能够直接根据字符的ASCII码查询J中是否存在该字符。
代码
class Solution {
public int numJewelsInStones(String J, String S) {
if (J == null || S == null) {
return 0;
}
if (J.length() == 0 || S.length() == 0) {
return 0;
}
char[] jewels = new char[58];//'z' = 'A' + 57,因此数组长度为58已足够
int count = 0;
for (int i = 0; i < J.length(); i++) {
char c = J.charAt(i);
jewels[c - 'A'] = 1;
}
for (int i = 0; i < S.length(); i++) {
char c = S.charAt(i);
if (jewels[c - 'A'] == 1) {
count++;
}
}
return count;
}
}
Review
Small Functions considered Harmful
这篇文章解释了小函数拥有的各种弊病,作者介绍了一般认为短小的函数所具备的优点,并且一一给出了自己的理由进行反驳。比如通常认为函数应该单一职责,因此应该尽量小,但是却很难去确认怎么样才算是单一职责。对于DRY原则,作者认为如果坚持按照DRY原则去做而不多做思考的话会导致只见树木不见森林,从而导致代码抽象混乱,同时作者给出了抽象的一些建议。同时,小函数会造成函数命名过长、代码定位困难、类文件增多等等各种问题。最后,作者给出了一些小函数真正有意义的情形。
读完这篇文章,有一个体会就是说,不能照搬各种原则,就比如说函数尽量短小这样的原则,应该要多思考,如果把这些抽成一个函数,是不是真的有什么好处?如果这样做的话会不会有什么问题?经过仔细的思考之后再决定是否进行修改。
Tip
使用Hierarchy viewer分析布局:
打开Android Device Monitor,不能在android studio3.1之后的版本中直接打开了,因此需要去sdk目录下面打开:打开sdk根目录的tools/monitor.bat,等一会之后就会启动了。
按如下步骤打开:
image.png
image.png
然后就打开了,在手机上运行相关的app,连接电脑,可以看到下图
image.png
选中某个节点,点击下图右上方圈起的按钮可以分析其渲染速度;
image.png
结果如下:
image.png
其中三个点一次代表measure、layout、draw时间,红黄绿三种颜色表示相对同级元素消耗时间的多少,红色耗时最多、黄色次之,绿色最快。