2019年5月3日

目录

​题目:​

​测试用例​

​解决方法一:使用hashMap映射键值,根据规则进行数值判断​

​性能结果:​

​小结:​

​解决方法二:性能确实好,但是if太多了​

​性能结果:​

​小结:​

​其他总结:​


题目:

LeetCode刷题之旅(简单-4): 罗马数字转整数_可变参数

测试用例

 

解决方法一:使用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);
}
}

性能结果:

LeetCode刷题之旅(简单-4): 罗马数字转整数_i++_02

小结:

  • 我觉得封装好了一个专用方法,能提现层次感,但是由于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;
}
}

性能结果:

LeetCode刷题之旅(简单-4): 罗马数字转整数_可变参数_03

小结:

  • 这是网友提供的解法,使用硬编码,也使用了穷举方法,对输入字符串进行一一组合判定;
  • 也许觉得代码比较冗余,但是我执行之后发现性能确是最好的;

其他总结:

  • String 和 Char的区别是什么?

char 定义时用 单引号 ,只能有一个字母数字,char 是一个基本类型;

eg:char a='h';   //不能直接对a调用方法

 

String定义时用 双引号 ,可以是一个,或者多个字母 汉字等,就是所谓的字符串,String 是一个类,可以直接引用;

eg:String a="hello";    //String是类,可以对对象进行调用

a.charAt(0);//返回 h 

a.charAt(1);//返回 e

  • java方法的可变参数使用?

这是JDK1.5新增语法,新特性,动态参数或者是可变参数的意思。 
(1)使用…将参数声明成可变长参数。 
(2)可变长参数必须是最后一个参数。 
(3)可变参数同时可以跟固定的参数混合使用,但是一个方法的参数中不能同时拥有2种类型的可变参数。