Algorithm
你让某些人为你工作了七天, 你要用一根金条作为报酬。这根金条要被分成七块。你必须在每天的活干完后交给他们一块。如果你只能将这根金条切割两次,你怎样给这些工人分?
分析:严格来说应该是智力题,不是算法题。
解决方法是切两次,把金条分成1/7,2/7,4/7三份,编号a,b,c
第一天,给a
第二天,给b,拿回a
第三天,给a
第四天,给c,拿回a,b
第五天,给a
第六天,给b,拿回a
第七天,给a
这周看完了《枪炮、病菌与钢铁》,简单记下读书笔记。
大多数都只对人类几千年,甚至只有最近几百年的历史有所了解。大家都知道中国在古代经济和科技都是比较领先的,后来被西方超过,不仅是中国,全球大多数发展落后的地方都被西方掠夺或者殖民过。但是从人类一万多年的历史看,人类是从非洲大陆起源的,为什么不是有领先优势的非洲人来占领和殖民欧亚大陆呢?决定人类社会发展、进步的决定性因素究竟是什么?
作者先提出了这个问题,然后开始从地理和历史中寻找答案。作者主要从地理环境和物种(尤其是可驯化的动植物)分布上尝试解答上面的问题,是大陆环境的差异而非人种的生物差异导致了上面所说的问题。
人类社会遵循采集狩猎到农业到工业的一个路径。气候和可供驯化的动物能够让人类更早定居并进入农业社会,从而发展出钢铁和枪炮等工具,人畜直接的传染能产生新的病菌同时让人群具有免疫力。这样有着先进工具和对病菌免疫的族群对传统狩猎社会是碾压式的优势,数百人的队伍就能打败上万人的军队。
书中一个比较有意思的地方是关于物种和技术的传播。欧亚大陆东西向的主轴线让作物和牲畜的传播比其他大陆更快,因为这种传播大大依赖于气候因而也就是大大依赖于纬度,传播的速度在非洲就比较缓慢了,而在美洲就尤其缓慢。除了纬度,还有高山和沙漠等环境的阻隔也能起到类似的作用。
另外一个观点是关于竞争的,为什么中国没有成为发展创造的中心。中国在地理上的四通八达最后却成了一个不利条件,某个专制君主的一个决定就能使改革创新半途而废,而且不止一次地这样做了。相比之下,欧洲在地理上的分割形成了几十个或几百个独立的、相互竞争的小国和发明创造的中心。如果某个国家没有去追求某种改革创新,另一个国家会去那样做的,从而迫使邻国也这样去做,否则就会被征服或在经济上处于落后地位。欧洲的地理障碍足以妨碍政治上的统一,但还不足以使技术和思想的传播停止下来。欧洲还从来没有哪一个专制君王能够像在中国那样切断整个欧洲的创造源泉。
书中关于技术先于需求、以及技术退化的相关的讨论也值得思考,现代的人们可能对技术的一些习以为常的观点和认知,在历史上却不是一直如此。
本书资料详实,文字严谨,观点明确,脉络清晰,值得一读。
解法一:三层暴力循环,时间复杂度 O(n3) 以上了,直接 PASS。
解法二:先排序,然后从第一个开始,用 0 减去的值当作剩下两数之和,采用 two-sum 的头尾指针办法来解决。
1 | public List<List<Integer>> threeSum(int[] num) { |
文章前面介绍了 Java 异常的一些历史,中间主要在说明 Kotlin 中异常应该怎么使用:
1 | val number = string.toIntOrNull() ?: defaultValue |
异步编程和协程,大多数情况和同步编程的异常处理一致。然而,在高度并发的情况下,可以使用结构化协程并发,所有的异常都在上层进行统一处理。
Android 中默认字体是 Roboto,4.0 引入,5.0 进行了大的改良。
中文 5.0 之前是 Droid,之后是 Noto Sans「思源黑体」。
android:typeface属性是自 API-1 以来就被添加进系统的,不能引用外部字体,只允许被设置为以下四种typeface:
android:fontFamily 对 typeface 的一次加强,可以支持更多的字体样式,例如:
fontFamily 优先级比 typeface 高,同时被设置的话,后者会自动失效
fontFamily的某些字体是有系统版本限制的,比如 sans-serif-medium 是 5.0 之后才添加的,版本支持情况可以看这个回答。
对于初学者,开发工具可以直接从官网下载,官方文档上有详细介绍以及大量的样例(尤其是Codelabs)
常用的clone、status、add、push、checkout等命令经常用不容易忘记,但是一些中等频率的命令每次都要查询,索性做个记录。完整的常用命令见附录。
1 | git config --global user.name "your_name" |
本地有文件
1 | cd existing_folder |
本地无文件
1 | git clone [url] |
本地存在仓库
1 | cd existing_repo |
1 | # 删除远程分支 |
clone大型仓库的最近N次提交
1 | git clone --depth 1 [url] |
Data classes 是一种替代Java中传统POJOs的简洁方式,每当有人向Java开发者推广Kotlin是救世主的时候,data classes 一定是前三的理由之一。
别误解我,data classes 很棒, 但是从每个人谈论它们(也包括使用,我打赌)的样子看,许多人并不懂 data 关键词真正对一个类做了什么。所以,让我们搞清楚!
这是一个非常简单的没有 data 关键词的数据模型类:
1 | class Person(val name: String, var age: Int) |
这个类实际上已经和我们叫做 POJO 的类是一样的了。在 Java 里,它有两个字段,合适的 getters 和 setters,然后还有一个有两个参数的构造器。
1 | public final class Person { |
现在我们把这个类变成一个 data class
1 | data class Person(val name: String, var age: Int) |
远程工作迫使一个公司做一些不一样的事情:
应该有自己选择在那里,什么时间工作的自由
作者即将去remote.com做新的CEO
感到不确定?把自己关心的和反对意见写下来,反复问自己就能明朗了
特别有意思的书,越往后读越有趣。关于人类和社会未来的思考,能让人暂时从当前的视野脱离出来,从更大的尺度看看更宏达的主题。