所谓ARTS: 每周至少做一个LeetCode的算法题;阅读并点评至少一篇英文技术文章;学习至少一个技术技巧;分享一篇有观点和思考的技术文章。(也就是Algorithm、Review、Tip、Share 简称ARTS)这是第十三期打卡。
Algorithm LeetCode算法
最后一个单词的长度 (https://leetcode-cn.com/problems/length-of-last-word/)
题目描述:给定一个仅包含大小写字母和空格 ' ' 的字符串,返回其最后一个单词的长度。
如果不存在最后一个单词,请返回 0 。
说明:一个单词是指由字母组成,但不包含任何空格的字符串。
示例:
代码语言:javascript复制输入: "Hello World"
输出: 5
今天这个算法,也不知道说啥好,没想到自己选了这么一个题目,是不是快被你们鄙视了呢。为了练手,我也是拼了。但是,要想让算法的结果提升,在这里还是需要告诉大家,传统的方式只是解决问题,优化的方式才是你需要在算法上实践并掌握的。
代码语言:javascript复制/**
*
* @Title: lengthOfLastWorld
* @Description: 利用库函数求解
* @param s
* @return int
* @throws
*/
public static int lengthOfLastWorld(String s) {
if (s == null) {
return 0;
}
String[] result = s.split(" ");
if (result.length == 0) {
return 0;
}
int length = result[result.length -1].length();
return length;
}
/**
*
* @Title: lengthOfLastWorld1
* @Description: 反向求解
* @param s
* @return int
* @throws
*/
public static int lengthOfLastWorld1(String s) {
int start = -1;
int end = -1;
for (int i = s.length() - 1; i >= 0; i--) {
if (s.charAt(i) != ' ' && end == -1) {
end = i;
start = i;
} else if (s.charAt(i) == ' ' && end != -1) {
start = i 1;
break;
} else if (s.charAt(i) != ' ' && end != -1) {
start = i;
}
}
if (end == -1) {
return 0;
}
return end - start 1;
}
Review 阅读并点评至少一篇英文文章
How to write like the great entrepreneurs (https://venturehacks.com/writing)
大伙们看到标题了吗?《如何像伟大的企业家一样写作》,是不是很吸引你呢,反正就是对我来说,确实值得一看。
在很多大V的建议里,写作一直都是一件必备的技能,不管你从事什么职业。如果你会写作,平时做好经验总结,个人感悟,打造出属于自己的IP,那么,对你的人生成长很有帮助。小编现在就是在坚持写作这件事,看到这文章,眼前一亮。
点进去文中,这篇文章虽然短小,但是确实句句实用。开头先引出“企业家是世界上最好的商业作家。如果你不能写,你就无法筹集资金。或招募。或出售。” 然后用了马斯克,乔布斯,以及巴菲特的案例。
这些是本文的引言,接下来给出了15条小贴士,让大家看看如何写作,所以在这我也分享给大家。因为力求原文意思,所以我只列出原文的话,具体解释原文里也有,请移步观看。
- Writing is a customer service problem.
- Pretend you’re sending an email.
- Sum it up in a tweet.
- Read it on your phone.
- Don’t write your thought process.
- Start with a summary.
- Writing is rewriting.
- Delete half the words.
- Avoid adjectives.
- Scrutinize every word for bias.
- Kill your darlings.
- Use persuasion checklists.
- Skim Strunk & White.
- Break the rules once you learn the rules.
- Writing is a design problem.
以上就是文中给出的建议,基本上都是很实用的。比如让你像写邮件一样进行写作;重复去写作修改;注重言辞等等等等,看完你会很兴奋的。加油吧!
Tip 一个技术技巧
今天还是接上一次关于Android存储优化的下一篇,是《数据库SQLite的使用和优化》。
SQLite的那些事儿
微信开源的内部使用的SQLite数据库WCDB
- ORM(Object Relational Mapping) 对象关系映射
Android中最常用的ORM框架有开源greenDAO和Google官方的Room。使用ORM框架真的非常简单,但是简易性是需要牺牲部分执行效率为代价的,具体的损耗跟ORM框架写得好不好很有关系。
为了提高开发效率,应用的确应该引入ORM框架。但这不能是我们不去学习数据库基础知识的理由,只有理解底层的一些机制,我们才能更加得心应手地解决疑难的问题。
考虑到可以更好的与Android Jetpack的组件互动,WCDB选择Room作为ORM框架
- 进程与线程并发
多进程并发:简单来说,多进程可以同时获取SHARED锁来读取数据,但是只有一个进程可以获取EXCLUSIVE锁来写数据库。对于iOS来说可能没有多进程访问数据库的场景,可以把locking_mode的默认值改成EXCLUSIVE。
代码语言:javascript复制PRAGMA locking_mode = EXCLUSIVE
在EXCLUSIVE模式下,数据库连接在断开前都不会释放SQLite文件的锁,从而避免不必要的冲突,提高数据库访问的速度。
多线程并发:SQLite支持多线程并发模式,需要开启下面的配置,当然系统SQLite会默认开启多线程Multi-thread模式。
代码语言:javascript复制PRAGMA SQLITE_THREADSAFE = 2
跟多进程的锁机制一样,为了实现简单,SQLite锁的粒度都是数据库文件级别,并没有实现表级甚至行级的锁。还有需要说明的是,同一个句柄同一时间只有一个线程在操作
- 查询优化
- 索引优化
- 页大小与缓存大小
- 其他优化:慎用“select *”,需要使用多少列,就选取多少列;正确地使用事务;预编译与参数绑定,缓存被编译后的SQL语句;对于blob或超大的Text列,可能会超过一个页的大小,导致出现超大页;定期整理或者清理无用或可删除的数据
通过引进ORM,可以大大的提升我们的开发效率。通过WAL模式和连接池,可以提高SQLite的并发性能。通过正确的建立索引,可以提升SQLite的查询速度。通过调整默认的页大小和缓存大小,可以提升SQLite的整体性能
SQLite的其他特性
- 损坏与恢复
- 加密与安全
数据库的安全主要有两个方面,一个是注入,一个是加密。防注入可以通过静态安全扫描的方式,而加密一般会使用SQLCipher支持。
- 全文搜索
SQLite的监控
- 本地测试
可以通过EXPLAIN QUERY PLAN测试SQL语句的查询计划,是全表扫描还是使用了索引,以及具体使用了哪个索引等。
- 耗时监控
- 智能监控
Share 一篇有观点和思考的技术文章
这周还是继续在设计模式的世界里前行中。
公众号地址: 设计模式之工厂模式(三)
爱生活,爱学习,爱感悟,爱挨踢