ARTS打卡 - 6
1. Algorithm
这道题应该是上周做的那道【整数转罗马数字】的相关的题,相对于【整数转罗马数字】这道题会简单很多。
解法一:首先还是按照枚举出所有可能的值的方法,把所有的特殊罗马数字以及对应的值存在一个map内:
1
2int[] numArray = new int[]{1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1};
String[] romans = new String[]{"M", "CM", "D", "CD", "C", "XC", "L", "XL", "X", "IX", "V", "IV", "I"};之后对传入的字符串进行截取,除了第一个和最后一个之外,每次截取两个字符,判断map内是否存在,计算出结果。
解法一只超越了百分之五。。所以考虑更好的解法。
解法二:仔细观察罗马数字的话,需要处理的特殊罗马数字应该是例如: “CM”、”CD” 等等这样的,可以看出来,只要是当前字符比下一个字符小的时候,则要将当前字符的符号改成负号。了解了这一点,就可以用罗马字符并且通过字符数组来进行判断了:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18map.put('M', 1000);
map.put('D', 500);
map.put('C', 100);
map.put('L', 50);
map.put('X', 10);
map.put('V', 5);
map.put('I', 1);
char[] array = s.toCharArray();
for(int i = 0; i < array.length;){
int cur = map.get(array[i]);
if (i < array.length - 1 && cur < map.get(array[i+1])){
result = result - cur + map.get(array[i+1]);
i += 2;
}else{
result += cur;
i++;
}
}更好的方式是将上面的map改成switch-case,并且使用s.charAt(), 这样就完全不需要额外的空间了。
2. Review
JavaScript — The difference between ForEach, and For…In
3 things you didn’t know about the forEach loop in JS
两篇文章都是讲js中的一些循环方式的使用,例如:for-each, for-in, for-of 等等,这些循环的用法在js中表现是不一样的:
- for-each
The reason is that we are passing a callback function in our
forEach
function, which behaves just like a normal function and is applied to each element no matter if wereturn
from one i.e. when element is 2 in our case.
也就是说for-each是每一个element都会有一个callback function,因此如果在for-each内使用 return
, break
, continue
等关键字的时候,是不会退出循环的,因为这些关键字的作用范围不是循环,而是每个元素的回调。
for-in:
当遍历对象时,循环计数器为对象的属性名
当遍历数组时,循环计数器为数组元素的索引,因此,使用for-in遍历数组,得到的是数组的索引而不是值
for-in会将原型中的方法与属性都遍历出来,可以使用hasOwnProperty()过滤非自身属性。
for-of:
- for-of是ES6引入的一个针对for-in的改进版本,其只作用于实现了iterator接口的对象,通常使用代替for-in作用于数组(数组已经实现了iterator接口),会直接获取到数组的值。
- 相比于for-each,可以支持break,continue,return。
3. Tip
- Jenkins的build command 不完全等同于shell环境,例如:
- 在本地shell中,使用’$var’单引号获取变量是获取不到的,得到的是一个字符串,而在Jenkins的command中获取project parameter 使用’$var’可以获取到变量,应该是在Jenkins的环境中,是直接传入对应的值而不是变量。
- 在shell中,如果传递的参数中有双引号,默认会全部去掉,因此想要对引号进行传递有两种方式:
- 转义字符:”\“”
- 如果在多个shell之间传递参数,不可能每次都给双引号加上转义字符,也可以通过字符串替换的方式来进行传递。