ARTS打卡 - 2
1. Algorithm
题目:8. String to Integer (atoi)
这次做的是一道字符串转int的题,刚看到题目的时候觉得比较简单,就是按顺序遍历字符串,如果找到数字就和之前的相加就可以了。但是在写的过程中,发现实际上有一些边界条件需要考虑,感觉以后在做题的时候可以先列出一些需要处理的特殊情况,比如一些边界条件。如果这道题按照 “【去空格】-> 【判断符号】->【求和并判断是否越界】” 这样的顺序的话,实际上也可以很顺利地写完。另外accept之后看了一下别人的解法,发现一个没有想到的点: 如果要计算数字,实际上可以通过 int a = char - '0'
, 我在代码里是通过 >= 48 && <=57
来判断的,显然前者更巧妙一些。
2. Review
Android MVI with Kotlin Coroutines & Flow
文章分享了一个用kotln coroutines (actor + channel)
和Stateflow
代替RxJava
实现MVI的方法,上面的图就是MVI的工作流程,我的理解是相对于MVVM来说,在ViewModel里多出了一个state的概念,view可以根据这个state的状态变化而改变。Intent可以看作是Action,通过view来发出一个Intent去改变state的状态,通过这种方式,Intent与State就对应了起来。这样一来会产生一个问题是如何管理多个state,MVI不是一个新的模型,现在的MVI由于响应式的结构(observable/subscriber),都会使用RxJava去管理并响应状态。文章中提出了使用Kotlin中的coroutines
以及StateFlow
来管理intent以及state,也就是说使用channle作为管道来发送Intent以及处理state, 这样做的好处是不仅可以与viewmodel的生命周期绑定,而且是线程安全的。此外,管理state可以使用StateFlow
(stateflow我的理解是一个状态流,可能存在Intent的响应是需要多个state来完成)。StateFlow官方也提供了实现(在kotlin1.3.3可以作为Experimental使用),文章提出了三点使用StateFlow的好处:
- 改变状态不再需要suspend方法
StateFlow
包含了Flow
的所有好处- 当没有subscriber的时候,不会发送改变状态。
3. Tip
Jenkins 通过 ssh remote 执行shell 命令的时候出现访问钥匙串权限不足的情况,想通过shell脚本直接在命令行模拟输入用户名密码验证权限,学习到了expect脚本的用法,可以模拟命令行输入
http://xstarcd.github.io/wiki/shell/expect.html
4. Share
在使用python的round()
函数的时候,了解了一个叫做 银行家舍入 的做法,比如如下函数:
1 | print(round(0.946, 2)) |
上面的函数会输出如下结果:
1 | 0.95 |
前两个输出我并没有感到以外,可以看到后两个输出怎么和我学过的四舍五入不一样,查了一下才知道银行家舍入的做法,大概就是如果舍入位为5的时候,则遵循 “奇进偶舍” 的原则。当舍入位不为5的时候,还是会遵守 “四舍五入” 。(如果一定要实现四舍五入可以通过Decimal模块,并指定舍入方式为 ROUND_HALF_UP
)