LeetCode刷题之旅(简单-4): 罗马数字转整数
原创
©著作权归作者所有:来自51CTO博客作者后台技术汇的原创作品,请联系作者获取转载授权,否则将追究法律责任
2019年5月3日
目录
题目:
测试用例
解决方法一:使用hashMap映射键值,根据规则进行数值判断
性能结果:
小结:
解决方法二:性能确实好,但是if太多了
性能结果:
小结:
其他总结:
题目:
测试用例
解决方法一:使用hashMap映射键值,根据规则进行数值判断
package leetCode;
import java.util.Arrays;
import java.util.HashMap;
/**
* Date: 2019/5/3 10 :28
*
*/
public class RomanNumeralToInteger {
//匿名内部类初始化法,调用父类(非私有方法)方法,向上转型
private static HashMap<String, Integer> romanNumberToIntegerMap = new HashMap<String, Integer>(){{
put("I",1);
put("V",5);
put("X",10);
put("L",50);
put("C",100);
put("D",500);
put("M",1000);
put("IV",4);
put("IX",9);
put("XL",40);
put("XC",90);
put("CD",400);
put("CM",900);
}};
public static int romanToInt(String s) {
char[] romanNumbers = s.toCharArray();
Integer result = 0;
for (int i = 0; i < romanNumbers.length ; i ++){
switch (romanNumbers[i]) {
case 'I':
if ((i < romanNumbers.length-1) && (romanNumbers[i + 1] == 'V' || romanNumbers[i + 1] == 'X')) {
result += getIntegerValue(romanNumbers[i] , romanNumbers[i + 1]);
i++;
}else {
result += getIntegerValue(romanNumbers[i]);
}
break;
case 'X':
if ((i < romanNumbers.length-1) && (romanNumbers[i + 1] == 'L' || romanNumbers[i + 1] == 'C')) {
result += getIntegerValue(romanNumbers[i] , romanNumbers[i + 1]);
i++;
}else {
result += getIntegerValue(romanNumbers[i]);
}
break;
case 'C':
if ((i < romanNumbers.length-1) && (romanNumbers[i + 1] == 'D' || romanNumbers[i + 1] == 'M')) {
result += getIntegerValue(romanNumbers[i] , romanNumbers[i + 1]);
i++;
}else {
result += getIntegerValue(romanNumbers[i]);
}
break;
default:
result += getIntegerValue(romanNumbers[i]);
break;
}
}
return result;
}
public static Integer getIntegerValue(Character... characters){
StringBuilder sb = new StringBuilder();
Arrays.stream(characters).forEach(
(r) -> {
sb.append(r);
}
);
return romanNumberToIntegerMap.get(sb.toString());
}
public static void main(String[] args){
int result = romanToInt("MCMXCIV");
System.out.println("result: "+result);
}
}
性能结果:
小结:
- 我觉得封装好了一个专用方法,能提现层次感,但是由于HashMap占用更多的内存,导致性能不如意;
解决方法二:性能确实好,但是if太多了
class Solution {
public int romanToInt(String s) {
char[] a = s.toCharArray();
int sum = 0;
for (int i = 0; i < a.length; i++) {
if (i != a.length - 1) {
if (a[i] == 'I' && a[i + 1] == 'V') {
sum += 4;
i++;
continue;
}
if (a[i] == 'I' && a[i + 1] == 'X') {
sum += 9;
i++;
continue;
}
if (a[i] == 'X' && a[i + 1] == 'L') {
sum += 40;
i++;
continue;
}
if (a[i] == 'X' && a[i + 1] == 'C') {
sum += 90;
i++;
continue;
}
if (a[i] == 'C' && a[i + 1] == 'D') {
sum += 400;
i++;
continue;
}
if (a[i] == 'C' && a[i + 1] == 'M') {
sum += 900;
i++;
continue;
}
}
if (a[i] == 'I')
sum += 1;
if (a[i] == 'V')
sum += 5;
if (a[i] == 'X')
sum += 10;
if (a[i] == 'L')
sum += 50;
if (a[i] == 'C')
sum += 100;
if (a[i] == 'D')
sum += 500;
if (a[i] == 'M')
sum += 1000;
}
return sum;
}
}
性能结果:
小结:
- 这是网友提供的解法,使用硬编码,也使用了穷举方法,对输入字符串进行一一组合判定;
- 也许觉得代码比较冗余,但是我执行之后发现性能确是最好的;
其他总结:
char 定义时用 单引号 ,只能有一个字母数字,char 是一个基本类型;
eg:char a='h'; //不能直接对a调用方法
String定义时用 双引号 ,可以是一个,或者多个字母 汉字等,就是所谓的字符串,String 是一个类,可以直接引用;
eg:String a="hello"; //String是类,可以对对象进行调用
a.charAt(0);//返回 h
a.charAt(1);//返回 e
这是JDK1.5新增语法,新特性,动态参数或者是可变参数的意思。
(1)使用…将参数声明成可变长参数。
(2)可变长参数必须是最后一个参数。
(3)可变参数同时可以跟固定的参数混合使用,但是一个方法的参数中不能同时拥有2种类型的可变参数。