ARTS - 2020.06.28 ~ 2020.07.05

ARTS打卡 - 5

1. Algorithm

12. Integer to Roman

这次做的是一道int类型的值(正整数,范围:1~3999)转罗马数字的题。开始看到题以为只需要根据10的幂来对原始数据取模,然后根据数字的大小来得出原始的罗马数字即可,但是在实际写的过程中发现有问题。最后只能想到用一个map来把各种特定的值一一对应起来(比如:{4, “IV”}, {5, “V”}等)。但是没有想到怎么计算数字规则,后来看了解法恍然大悟:使用贪心算法:

  • 列出两个特殊数字的数组,阿拉伯数字与罗马数字从大到小一一对应

  • 从数组index = 0开始,与原数字比较,比原数字大则移动指针,比原数字小则:

    1
    2
    num -= array[index];
    result.append(roman[index]);

这里记录一下贪心算法的基本思想:

  • 从某个初始解出发
  • 采用迭代的过程,当可以向目标前进一步使,就根据局部最优策略,得到一部分解,缩小问题规模
  • 将所有解综合起来。

经典的贪心算法例子:

  • 找零问题
  • 背包问题
  • 活动选择问题

2. Review

Cool Javascript 9: Named arguments — Functions that get and return Objects

在使用js的过程中,发现不知道怎么写js的具名参数,不如kotlin那么方便。。。所以看到了这篇文章,文章说明的是ES6提供的具名参数的用法,如下:

1
2
3
4
5
6
7
8
9
10
function apiRequest({
endpoint,
method: 'GET',
getParams = {},
...
authRequest = true
}={}){}

// 调用
apiRequest({endpoint: 'endpoint.xxx.xxx', authRequest = false})

可以看出来,实际上是将参数用一个object的方式表示,这样的话就可以跳过其中的一些默认参数直接使用具名参数的方式,还有另一种方式,也可以跳过一些默认参数:

1
2
3
4
function test(start, second='second', third='third', fourth = 'fourth')

// 调用
test('first', Array(2), 'f')

通过上述例子可以看到使用 Array(2)跳过中间 2个默认参数。

3. Tip

  • 如何使用node inspect debug调试mocha框架:
    • 使用命令 mocha –reporter spec –inspect-brk test.js
  • 升级了Android Studio 4.0 之后编译器提示:Default Activity not found 的错误,修改了 运行方式中的Default ActivitySpecified Activity 并指定Activity,会提示 Activity not definied in AndroidManifest.xml,看了对应的 AndroidManifest.xml 是声明了Activity的(没有找到原因),暂时使用了如下的解决办法:
    • 修改运行方式 (Editr Configuration) -> Default Activity : 修改为Nothing。(这种方式可以正常run 程序,但安装好apk之后不会启动)

4. Share

Lambda初次使用很慢?从JIT到类加载再到实现原理

  • 文章介绍了为什么使用Lambda表达式第一次使用会很慢,而之后就会非常快。(因为需要首次加载生成Lambda表达式时,需要额外加载ASM框架,需要更多时间)
  • 匿名内部类在编译阶段会多出一个类,而Lambda不会,仅会生成一个函数。而且匿名内部类将会被实例化成为对象,增加内存消耗。此外,类的加载和验证也会影响程序的启动性能。