ARTS - 01
ARTS - 01
Alg
[题目(]https://leetcode-cn.com/problems/rearrange-words-in-a-sentence/)
一个很简单的题目,但是好久没写算法题目了,略微生疏,很多地方没有考虑到。粗暴地直接提交-运行出错-修改-提交-编译出错-修改-提交-.... , 甚至没有自测几个用例,罪过罪过,阿弥陀佛。
题目
就是把给定的 n 个字符串,其中最长的字符串长度为 l,按照长度从低到高输出,相同长度保持输入顺序。
解答
开了一个最大容量的数组,每个元素是一个链表,表示长度为多少的字符串们。遍历输入字符串数组,放到各自长度上。然后遍历输出。S = O(固定,输入字符串里最长的字符串长度 l ) , 最好时间复杂度 O(n),最差 O( n2).
有改进空间 :
- 比如每个链表都保存一个尾节点指针,加入的时候直接加到尾部,时间就是稳定 O(n)。
- 输出的时候,可以修改数组增加“下个非空元素位置”的信息,也可以让输出时候的遍历在输入字符串长度差异很大的时候有相当的优化。
缺点: - 空间占用太大,可能有浪费
Rev
ANdroid 的一些开发实践建议,简单可以分为 :
- Android 项目代码的实践。例如 如何引库、代码检测、测试驱动等,还有一些实践的建议:例如关于 Rx,EventBus,Service 的等。
- Android 项目构建。主要是 gradle 构建如何加速,以及一些构建的设置,比如 CI 接入等。
- Android 项目功能的实践。 考虑设备状态(电量、网络连接状态)、UI 等(里面有句很搞笑的话
A user interface is like a joke. If you have to explain it, it’s not that good;
😁)
Tip
在使用 node 跑 js 代码的时候,可以使用 chrome 来进行 debug , 具体方法为
- 增加
--inspect
选项,即node --inspect 正常的后续命令
, 其中还可以自己指定 ip 和端口,具体参考 node 文档吧 node-如何 debug。 - 在 chrome 里打开 chrome 的 debug 页面
chrome://inspect
- 在页面里的
Remote Target
里找到要 debug 的程序。
Share
想简单谈谈 java 项目的包结构
。
因为我本来比较注意代码的整洁和优雅,前段时间特别希望加速项目模块化,那时候想到了之前写 js 的时候有一个 “查看 cyclic dependency”, 于是用 AS 自带的试了一下,出来的结果跟我想的不同,是以包为单位的( js 的 eslint 是以文件为单位的)。后来想通了, java 文件同包引用不需要明写 import
,所以可能检测起来不容易做到检测同包文件的依赖关系。再后来又思考了一下,觉得 java 的包本来就应该是一个独立的单位,这里我想类比一下 kotlin 的文件, kotlin 中一个文件是可以有多个类的,这些文件应该是 不可拆分
的, 而对应到 java, 我认为一个 package 就有点像 kotlin 里的一个文件(只是像,不是完全对等)。
之前跟同学吃饭的时候也讨论了这一点,我说 Android 项目里就不应该所有的 activity / fragment 各自一个包,毫无意义,只能表示 “这个目录下的文件都以 Activity.java
结束”,他提到最开始的 AOSP 里的很多项目都是这个写法,我觉得就算 AOSP 很有权威,那他们在这点也做得不好。
上面的 Rev 里的 blog 中也说到了这个, 里面就有一条 Package by Feature, not layers;
。我认为分包应该是模块化的前一步,也是项目解耦,以及各个文件可以明确对外部的依赖以及更远的重构的前提。