Dimple在左耳听风ARTS打卡(十三)

2019-12-27 14:59:07 浏览数 (1)

所谓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条小贴士,让大家看看如何写作,所以在这我也分享给大家。因为力求原文意思,所以我只列出原文的话,具体解释原文里也有,请移步观看。

  1. Writing is a customer service problem.
  2. Pretend you’re sending an email.
  3. Sum it up in a tweet.
  4. Read it on your phone.
  5. Don’t write your thought process.
  6. Start with a summary.
  7. Writing is rewriting.
  8. Delete half the words.
  9. Avoid adjectives.
  10. Scrutinize every word for bias.
  11. Kill your darlings.
  12. Use persuasion checklists.
  13. Skim Strunk & White.
  14. Break the rules once you learn the rules.
  15. Writing is a design problem.

以上就是文中给出的建议,基本上都是很实用的。比如让你像写邮件一样进行写作;重复去写作修改;注重言辞等等等等,看完你会很兴奋的。加油吧!

Tip 一个技术技巧

今天还是接上一次关于Android存储优化的下一篇,是《数据库SQLite的使用和优化》。

SQLite的那些事儿

微信开源的内部使用的SQLite数据库WCDB

  1. ORM(Object Relational Mapping) 对象关系映射

Android中最常用的ORM框架有开源greenDAO和Google官方的Room。使用ORM框架真的非常简单,但是简易性是需要牺牲部分执行效率为代价的,具体的损耗跟ORM框架写得好不好很有关系。

为了提高开发效率,应用的确应该引入ORM框架。但这不能是我们不去学习数据库基础知识的理由,只有理解底层的一些机制,我们才能更加得心应手地解决疑难的问题

考虑到可以更好的与Android Jetpack的组件互动,WCDB选择Room作为ORM框架

  1. 进程与线程并发

多进程并发:简单来说,多进程可以同时获取SHARED锁来读取数据,但是只有一个进程可以获取EXCLUSIVE锁来写数据库。对于iOS来说可能没有多进程访问数据库的场景,可以把locking_mode的默认值改成EXCLUSIVE。

代码语言:javascript复制
PRAGMA locking_mode = EXCLUSIVE

在EXCLUSIVE模式下,数据库连接在断开前都不会释放SQLite文件的锁,从而避免不必要的冲突,提高数据库访问的速度。

多线程并发:SQLite支持多线程并发模式,需要开启下面的配置,当然系统SQLite会默认开启多线程Multi-thread模式。

代码语言:javascript复制
PRAGMA SQLITE_THREADSAFE = 2

跟多进程的锁机制一样,为了实现简单,SQLite锁的粒度都是数据库文件级别,并没有实现表级甚至行级的锁。还有需要说明的是,同一个句柄同一时间只有一个线程在操作

  1. 查询优化
  • 索引优化
  • 页大小与缓存大小
  • 其他优化:慎用“select *”,需要使用多少列,就选取多少列;正确地使用事务;预编译与参数绑定,缓存被编译后的SQL语句;对于blob或超大的Text列,可能会超过一个页的大小,导致出现超大页;定期整理或者清理无用或可删除的数据

通过引进ORM,可以大大的提升我们的开发效率。通过WAL模式和连接池,可以提高SQLite的并发性能。通过正确的建立索引,可以提升SQLite的查询速度。通过调整默认的页大小和缓存大小,可以提升SQLite的整体性能

SQLite的其他特性
  1. 损坏与恢复
  2. 加密与安全

数据库的安全主要有两个方面,一个是注入,一个是加密。防注入可以通过静态安全扫描的方式,而加密一般会使用SQLCipher支持。

  1. 全文搜索
SQLite的监控
  1. 本地测试

可以通过EXPLAIN QUERY PLAN测试SQL语句的查询计划,是全表扫描还是使用了索引,以及具体使用了哪个索引等。

  1. 耗时监控
  2. 智能监控

Share 一篇有观点和思考的技术文章

这周还是继续在设计模式的世界里前行中。

公众号地址: 设计模式之工厂模式(三)

爱生活,爱学习,爱感悟,爱挨踢

0 人点赞