所谓ARTS:每周至少做一个LeetCode的算法题;阅读并点评至少一篇英文技术文章;学习至少一个技术技巧;分享一篇有观点和思考的技术文章。(也就是Algorithm、Review、Tip、Share 简称ARTS)这是第五期打卡。
Algorithm LeetCode算法
最长公共前缀
(https://leetcode.com/problems/longest-common-prefix/)
题目描述:编写一个函数来查找字符串数组中的最长公共前缀。
如果不存在公共前缀,返回空字符串 ""。
示例 1:
输入:["flower","flow","flight"]
输出: "fl"
示例 2:
输入:["dog","racecar","car"]
输出: ""
解释:输入不存在公共前缀
说明:所有输入只包含小写字母 a-z。
这题有一个很大的坑,就是边界问题,小编给的答案好几次不通过,就是因为遇到了各个边界问题没有处理好,导致一直出错,甚至还出现了一次数组越界,尴尬。在小编代码习惯里,其实理论上已经做了处理的,可能在跑算法的时候确实不行吧。
而且,这次虽然是标记为简单的题目,但是解法却有很多,小编看这题讨论的也是很激烈。如你所想,小编还是没有很给力,写了个双重循环,循环来判断是否符合要求,而且还提交了好几次。
在题解里,分别有几种方法,水平扫描法,水平扫描,分治,二分查找法,这题小编感觉很是经典,解答的示例和解释小编看了好几遍,学习了好几遍。(https://leetcode-cn.com/problems/longest-common-prefix/solution/)这是中文版地址的解答描述,大家可以去看下,小编在这里就不一一赘述啦。
public static String longestCommonPrefix(String[] strs) {
if (strs.length < 0) {
return "";
}
if (strs.length == 1) {
return strs[0];
}
StringBuilder stringBuilder = new StringBuilder();
if (strs.length > 1) {
int length = strs[0].length();
for (int i = 0; i < length; i++) {
String[] aStringArr = strs[0].split("");
String info = aStringArr[i];
for (int j = 1; j < strs.length; j++) {
if (strs[j].length() <= i || !String.valueOf(strs[j].charAt(i)).equals(info)) {
return stringBuilder.toString();
}
if (String.valueOf(strs[j].charAt(i)).equals(info) && j == (strs.length - 1)) {
stringBuilder.append(info);
}
}
}
}
return stringBuilder.toString();
}
Review 阅读并点评至少一篇英文文章
Android Q Beta 2 is now available, including new ‘bubbles’ for multi-tasking
(https://thenextweb.com/google/2019/04/03/android-q-beta-2-is-now-available-including-a-new-way-to-multi-task/)
前段时间,Android更新了最新版本Android Q的Beta1,现在又更新了Beta2,作为曾经狂热的Android开发者,现在是Java开发,还是迫不及待地想了解一番最新版本的Android到底有什么美妙的地方。
文中着重介绍了Android Q Bete1版本有个隐藏的功能,将通知放在浮动的“气泡”中,类似于Facebook的Chat Heads消息。这个有一个好处就是,可以让你在不下拉通知栏的情况下阅读通知,并可以在手上使用手机的时候轻松完成更多的任务。但是,他之所以隐藏,是因为感觉还不成熟。
但是,后面又进行了这个想法的猜想,比如之前说的Facebook有类似的功能,那我们就可以想到,其实我们的短信,微信也是可以这样的。在消息来的第一时间用一个气泡提示框弹出,并且快速回复。小编在想,如果那时候我正在玩王者荣耀,正在吃鸡咋办,不过攻城狮们肯定已经想到何事开启啦。或者王者荣耀等游戏、或者手机开发厂商定制ROM的时候,肯定已经制定好对策,比如来一个游戏勿扰模式等等。这个勿扰模式貌似现在是不是已经有的了,那就是勿扰增强模式吧。
不过都是猜想,要是现在有一台谷歌亲儿子,那是可以考虑升级一下的。噢?什么是谷歌亲儿子?那就是对我们略遥远的Pixel phone啦,目前只有他可以下载更新Android Q Beta1和Beta2版本。小编朋友有个Google忠实粉,好像入手过的,回头看看,让他尝尝鲜,顺带看看刚才说的打游戏情景下如何处理吧。
虽然离开Android开发一年多了,但是Android生态真的是感觉越来越好,小编在考虑业余时间也还是需要重拾Android的,毕竟方便调试,方便自主开发,方便实现自己想要的功能的App。还记得当初自学的时候,那种自己编写,自己成功的感觉很爽。你觉得呢?
Tip 一个技术技巧
上次聊到的是我学习《Java核心技术36讲》中第26讲的内容,这次我把第27讲做的笔记和大家分享下,主要是描述Java垃圾收集器相关的内容。学完Java这门课程,还输出了一篇读后感,在share部分一同分享给大家,和大家一起在Java的世界里遨游。
垃圾收集器(GC,Garbage Collector)
典型回答:
Serial GC,它是最古老的垃圾收集器,体现在其收集工作是单线程的,并且在进行垃圾收集过程中,会进入臭名昭著的“Stop-The-World”状态
从年代的角度,通常将其老年代实现单独称作Serial Old,它采用了标记-整理(Mark-Compact)算法,区别于新生代的复制算法。对应的JVM参数是:-XX:+UserSerialGCParNew GC,很明显是个新生代GC实现,它实际是Serial GC的多线程版本,最常见的应用场景是配合老年代的CMS GC工作,对应参数:-XX:+UserConcMarkSweepGC -XX:+UserParNewGC
CMS(Concurrent Mark Sweep)GC,基于标记-清除(Mark-Sweep)算法,设计目标是尽量减少停顿时间。攒在这内存碎片化问题,所以难以避免在长时间运行等情况下发生full GC。因为并发,CMS会占用更多CPU资源,并和用户线程争抢
Parrallel GC,早起JDK 8等版本中,是server模式JVM的默认GC选择,被称作吞吐量优先的GC。特点是新生代和老年代GC都是并行进行的,在常见的服务器环境中更加高效。
开启选项:-XX:+UserParallelGC另外,Parrallel GC引入了开发者友好的配置项,我们可以直接设置暂停时间或吞吐量等目标,JVM会自动进行适应性调整,例如
-XX:MaxGCPauseMillis=value
-XX:GCTimeRatio=N // GC 时间和用户时间比例 = 1/(N+1)
G1 GC 这是一种兼顾吞吐量和停顿时间的 GC 实现,是JDK 9以后的默认GC选项
常见的垃圾收集器算法
复制(Copying)算法,新生代GC
标记-清除(Mark-Sweep)算法
标记-整理(Mark-Compact),类似于标记-清除,但我为了避免内存碎片化,它会在清理过程中将对象移动, 以确保移动后的对象占用连续的内存空间
Share 一篇有观点和思考的技术文章
继续设计模式的学习执行,更新到观察者模式。在上面说道,我学习Java输出了一篇学后感,和大家一起共勉。
公众号地址:
设计模式之观察者模式(二)
我学Java我傲娇
知乎地址:
设计模式之观察者模式(一)
我学Java我傲娇
爱生活,爱学习,爱感悟,爱挨踢
![640?wx_fmt=jpeg](https://i-blog.csdnimg.cn/blog_migrate/23586974e4e01ef10c3320b9eee408db.jpeg)